繁体   English   中英

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

[英]CakePHP: proper controllers, models, and actions structure

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

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

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

  1. 控制器:对于此搜索页面 ,应使用哪些控制器? 我现在默认为PagesController用于静态页面,但是这个搜索页面真的应该使用PagesController吗? 我还有在创建ProductOrder模型时创建的ProductsControllerOrdersController ,但是使用一个全新的控制器(可能是一个名为SearchController似乎更合适。 通过这种方式,URL保持在myapp/search/...并且不会遍布整个地方。 这是正确的方法吗? (我知道我可以重写URL,但这是为了以后)

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

  3. 如果我的方法(从1和2)不低效,错误或不正确,你能建议一个好的结构来设置这个特定的页面,关于使用什么控制器以及控制器应该如何使用模型及其行为?

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

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

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访问这些模型,然后运行您的搜索。

为了坚持“Fat Models,Skinny Controllers”的口头禅,我建议保持你的控制器代码很小 - 如下所示:

$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);
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM