2

我知道问题标题似乎很开放,但我已经围绕这个主题做了一些阅读/实验,并且除了构建我自己的程序式应用程序之外,还使用了 Cake。我的目标是将我的程序应用程序带到 CakePHP。

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

所以,我有一堆clients,每个客户都有 1 个或更多accounts。每个account都有holdings其值存储在特定日期的值。这是数据库结构的示例

数据库结构

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

我做了什么

因此,按照教程,我为客户和帐户制作了模型,并设法链接(关联?)CakePHP 中的客户和帐户表。我还制作了允许我检索客户和帐户的控制器和视图,并制作了索引、视图、编辑视图。

这是我的模型类:

//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 表格中,然后我什至可以在图表等上绘制值。

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

我的问题

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

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

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

4

1 回答 1

2

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

另一方面,据我所知, MVC非常清楚

  • 处理数据的所有内容都应该放入模型中。
  • 处理用户交互/流控制的所有内容都应该放在控制器中。
  • 处理用户界面的所有内容都应该放在视图中。

应用于 CakePHP

这意味着您的大部分逻辑都保留ModelsControllers. 这种方式也更好,因为您可以轻松地$this->Model->foo()从任何链接的控制器调用,而由于性能问题,几乎不鼓励调用在另一个控制器中定义的函数,这实际上不是一个好习惯。

您可以调查的其他事项是ComponentsBehaviors

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

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

你的情况

在您的特定情况下,我会在模型中使用小功能。例如,所有处理馆藏信息的函数都应该在Holding模型中。这很好,因为您可以从 Controller 或其他模型中调用这些函数,您可以preparePortfolio()在模型中拥有一个函数User来调用模型中的一些函数Holding,进行各种安排,然后将合并的数据返回给UserController准备传递的数据到视图。

最后一件事

Hash如果你处理数组和循环,我强烈建议你看看这个类。您可以通过使用其中一些函数来避免循环遍历多维数组,并且如果您处理巨大的数组,它可以从字面上提高您的性能。它的语法也比叠层循环更简洁。


提供帮助的代码示例

应用程序/控制器/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' ) );
    }
}

应用程序/模型/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;
    }
}

应用程序/模型/帐户.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'
        )
    );
}

应用程序/模型/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;
    }
}
于 2013-09-12T10:58:34.623 回答