php - 如何使用 CakePHP 进行客户投资组合管理应用程序

标签 php cakephp cakephp-model

我知道问题标题似乎相当开放式,但我已经围绕该主题做了一些阅读/实验,并且除了构建我自己的程序式应用程序之外,还对 Cake 有所了解。我的目标是将我的程序应用程序移植到 CakePHP。

应用程序做什么(或想要做什么)

所以,我有一堆客户端,每个客户端都有1个或多个帐户。每个帐户都有持股,其值存储在特定日期。这是数据库结构的示例

database structure

这个想法是为客户、帐户等提供标准的 CRUD 页面。但也有更复杂的页面,例如,提供客户帐户的返回历史记录以及投资组合统计信息。 (我还有其他表格,其中包含更多信息,但为了简单起见,我暂时在本期中省略了它们)

我做了什么

因此,在遵循教程后,我为客户和帐户制作了模型,并设法在 CakePHP 中链接(关联?)客户和帐户表。我还制作了 Controller 和 View ,允许我检索客户和帐户,并制作了索引、 View 、编辑 View 。

这是我的模型类:

//Client.php
class Client extends AppModel {
    public $hasMany = 'Account';
}

//Account.php
class Account extends AppModel {
    public $belongsTo = 'Client';
    public $hasMany = 'Holding';
}

//Holding.php
class Holding extends AppModel {
        public $belongsTo = 'Account';
    }

我之前做了什么

假设我想制作一个页面来显示给定客户的投资组合返回。我在上一个(原始)应用程序中所做的只是创建一个 php 文件(portfolio.php)。然后,我将使用原始 SQL 语句在数据库中查询每个月末客户持有的总和。然后我会循环遍历返回数组,计算从一个月到下一个月的值变化百分比。

然后可以将这些数据显示在 html 表格中,然后我什至可以将这些值绘制在图表等上。

这当然是一个简单的例子。此页面/ View 将介绍其他信息,例如基准比较(通过另一个数据库表)、夏普比率、波动率、年化返回率等统计数据。

我的问题

如何在 CakePHP 中实现与上一节类似的功能?我所追求的 View /页面似乎不符合 MVC 意识形态。计算涉及的逻辑会去哪里(例如,计算值数组的返回值)?

如果我能解释一下这种事情是如何在 MVC/CakePHP 中实现的,那将会非常有帮助。

博客教程很有意义,但我还不知道它将如何扩展到更复杂的应用程序。

最佳答案

CakePHP 作为一个框架,可以让您完全自由地放置逻辑。它告诉您应该在哪里进行数据库调用(模型)以及应该在哪里控制应用程序的流程( Controller ),但是当涉及到幕后逻辑时,文档并没有说太多。

MVC 据我了解 另一方面很清楚

  • 所有处理数据的内容都应该放入模型中。
  • 所有涉及用户交互/流程控制的内容都应该放在 Controller 中。
  • 所有与用户界面相关的内容都应该出现在 View 中。

应用于CakePHP

这意味着您的大部分逻辑仍保留在 Models 中,并且很少有 Controllers 中的内容。这种方式也更好,因为您可以轻松调用 $this->Model->foo()由于性能问题,几乎不鼓励从任何链接的 Controller 调用在另一个 Controller 中定义的函数,这实际上不是一个好的做法。

您可以调查的其他内容有 Components Behaviors .

Components基本上是一组您想要在 Controller 之间共享的功能。它具有与 Controller 或多或少相同的功能。但没有专用routes , viewsmodel .

Behaviors与模型等效,当您有多个具有相似行为的模型并且您希望保持代码干燥时,这会很好。

您的案例

在您的特定情况下,我会在模型中使用小函数。例如,所有操作持有信息的函数都应该在 Holding 中。模型。这很好,因为您可以从 Controller 或其他模型调用这些函数,您可以有 preparePortfolio()在您的 User 中运行调用 Holding 中的一些函数的模型模型,进行各种整理,然后将综合数据返回给UserController准备好传递给 View 。

最后一件事

我强烈建议您查看 Hash 如果您处理数组和循环,请使用类。您可以使用其中一些函数来避免循环多维数组,如果您处理巨大的数组,它实际上可以提高您的性能。它的语法也比叠瓦式循环干净得多。


提供帮助的代码示例

app/Controller/ClientsController.php

<?php
App::uses( 'AppController', 'Controller' );
class ClientController extends AppController {
    public function portfolio( $clientId ) {
        $this->Client->id = $clientId;

        if( !$this->Client->exists() ) {
            throw new NotFoundException( 'There are no client with this id' );
        }

        $data = $this->Client->portfolio( $clientId );

        $this->set( compact( 'data' ) );
    }
}

app/Model/Client.php

<?php
App::uses( 'AppModel', 'Model' );
class Client extends AppModel {

    public $hasMany = array(
        'Account' => array(
            'className'    => 'Account',
            'foreignKey'   => 'client_id'
        )
    );

    public function portfolio( $clientId ) {
        $holdings = $this->Account->Holding->find( 'all', $findParameters );
        $foo = $this->Account->Holding->doThings( $holdings );
        return $foo;
    }
}

app/Model/Account.php

<?php
App::uses( 'AppModel', 'Model' );
class Account extends AppModel {
    public $hasMany = array(
        'Holding' => array(
            'className'    => 'Holding',
            'foreignKey'   => 'account_id'
        )
    );

    public $belongsTo = array(
        'Client' => array(
            'className'    => 'Client',
            'foreignKey'   => 'client_id'
        )
    );
}

app/Model/Holding.php

<?php
App::uses( 'AppModel', 'Model' );
class Holding extends AppModel {
    public $belongsTo = array(
        'Account' => array(
            'className'    => 'Account',
            'foreignKey'   => 'account_id'
        )
    );

    public function doThings( $holdings ) {
        foreach( $holdings as $key => $value ) {
            // code...
        }
        return $bar;
    }
}

关于php - 如何使用 CakePHP 进行客户投资组合管理应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18761659/

相关文章:

php - 将具有特定值的数组元素移动到数组顶部

php - 如何防止php/mysql中记录的多次更新

php - SQL 和 Codeigniter 计算定期付款的复利

AJAX 请求的 CakePHP 403

php - 我如何在 CakePHP 中使用 beforeValidate()?

php - cakephp 外键不是主键

php - 用于 PHP/Ruby 的 NetBeans IDE

php - $ajax->link() 在 Firefox 中不起作用?

php - 避免在 cakephp 中与两个不同域进行 session 匹配?

cakephp - 使用单个事务提交和回滚的多模型事务管理