我知道问题标题似乎相当开放式,但我已经围绕该主题做了一些阅读/实验,并且除了构建我自己的程序式应用程序之外,还对 Cake 有所了解。我的目标是将我的程序应用程序移植到 CakePHP。
应用程序做什么(或想要做什么)
所以,我有一堆客户端
,每个客户端都有1个或多个帐户
。每个帐户
都有持股
,其值存储在特定日期。这是数据库结构的示例
这个想法是为客户、帐户等提供标准的 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
, views
或model
.
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/