CakePHP:适当的控制器、模型和动作结构


CakePHP: proper controllers, models, and actions structure

我有一个简单的Web应用程序,其中包含orders数据库表和products,我正在使用CakePHP重新编写。还有更多,但为简单起见,我在这里只使用这两个。在 Web 应用程序中,我希望能够搜索项目、搜索订单和执行与订单相关的工作,但我在设置和选择要用于制作此 Web 应用程序的组件时遇到困难。作为我问题的一个例子,我有以下页面。查看下面的布局。

|------------------------------|   
|            My App            | 
|------------------------------|
|Search <--| search order      |
|Orders    | search product    |
|etc.      |                   |
|          |                   |
|          |                   |
|------------------------------|

图:左侧导航栏和正文所示。箭头表示我们所在的页面。

    控制器
  1. :对于此搜索页面,应使用哪些控制器?我现在默认为静态页面PagesController,但这个搜索页面真的应该使用 PagesController 吗?我也有在创建ProductOrder模型时创建的ProductsControllerOrdersController,但使用一个全新的控制器似乎更合适,也许是一个叫做 SearchController 的控制器。这样,URL就保持在myapp/search/...下,不会到处都是。这是正确的方法吗?(我知道我可以重写 URL,但那是以后的事了)

  2. 模型和操作:我有ProductOrder模型。其中每个模型都有其各自数据库表的搜索逻辑。如果为上述页面创建了一个新控制器,那么该控制器可以简单地使用这些模型的操作,对吗?我正在阅读控制器和模型分离是完全正常的,实际上是一件好事。起初我以为它们是一起的,但我对 CakePHP 越熟悉,似乎恰恰相反。

  3. 如果我的方法(从 1 和 2)不是低效、错误或不恰当的,您能否建议一个好的结构来设置这个特定页面,说明使用什么控制器以及控制器应该如何使用模型及其操作?

TLDR:

真正的答案是——个人喜好。 无论您创建SearchesController还是使用ProductsControllerOrdersController(但不要使用PagesController),这都没什么大不了的。

我的偏好和推理

我会创建一个SearchesController. 这对于组织目的最有意义。 你所有的搜索功能都可以在同一个控制器中,所有的搜索视图都将在"Views/Searches/"文件夹中,任何/所有相关的css和javascript都可以在/css/searches/js/searches/中(如果你喜欢像我一样组织)。

您还需要创建一个搜索模型(Models/Search.php),并在其中添加:public $useTable = false;[详细信息]以告诉它您不会创建searches表。

在 SearchController 的每个操作(如 function orders()function products() )中,您可以使用$this->loadModel('Order'); [详细信息] 使这些模型可从SearchesController访问,然后运行搜索。

为了坚持"胖模型,瘦控制器"的口头禅,我建议保持控制器代码小 - 像这样:

$opts = array('limit'=>5);
$orders = $this->Order->search($string, $opts);

然后,在您的订单模型中(根据此示例),执行逻辑的实质(下面是粗略的想法):

public function search($string = null, $opts = null) {
    $params = array();
    $params['limit'] = 10; //sets default
    if(!empty($opts['limit'])) $params['limit'] = $opts['limit'];
    //... build options, contains, limits...etc
    return $this->find('all', $params);
}

将所有控制器操作放在一起可以让您更轻松地进行全面更改 - 例如,如果您想为每页结果设置一个变量来更改所有搜索页面......等。 我敢肯定还有很多其他的想法,但最重要的是,它将类似的代码保持在一起。

我建议你使用另一个搜索控制器。 在搜索控制器中,在类级别,只需添加此行var $uses = array('Order', 'Product');,即可访问"订单"和"产品"表。

只需使用$this->Order->find()$this->Product->find()

  1. 您无需为此创建新的控制器。您可以在该控制器上使用相同的控制器(例如产品)和名为"搜索"的操作。因此,您的链接将指向/产品/搜索
  2. 即使创建新的控制器,您也可以通过导入相应的控制器来访问其他模型
  3. 我建议坚持 Cake 通常做的事情,为应用程序上的每个模型创建一个控制器。通常,每个模型都应该是一个类,该类表示要转换为系统的方案中的实体(物理或逻辑),并且每个方法都有一个控制器。