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

时间:2012-04-17 22:36:56

标签: php model-view-controller cakephp

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

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

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

  1. 控制器:对于此搜索 ,应使用哪些控制器?我现在默认为PagesController静态页面,但此搜索页面是否应该使用PagesController?我创建ProductsControllerOrdersController模型时创建了ProductOrder,但使用全新的控制器(可能是一个名为{{ 1}}。这样,网址就会保留在SearchController之下,并且不会遍布整个地方。这是正确的方法吗? (我知道我可以重写网址,但以后会这样做)

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

  3. 如果我的方法(从1和2)效率不高,错误或不合适,你能否提出一个好的结构来设置这个特定的页面,关于使用什么控制器以及控制器应该如何使用模特和他们的行动?

3 个答案:

答案 0 :(得分:1)

我建议您使用其他搜索控制器。在搜索控制器内部,在类级别添加此行var $uses = array('Order', 'Product');,以便您可以访问订单和产品表。

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

即可

答案 1 :(得分:1)

<强> TLDR:

真正的答案是 - 个人偏好。无论是创建SearchesController还是使用ProductsControllerOrdersController(但不使用PagesController),这都不是什么大问题。

我的偏好和推理

我会创建一个SearchesController。这仅仅是出于组织目的而最有意义的。您的所有搜索功能都可以位于同一控制器中,所有搜索视图都位于“视图/搜索/”文件夹中,任何/所有相关的css和javascript都可以位于/css/searches/js/searches/(如果你喜欢像我一样组织这种方式。)

您还需要制作搜索模型(Models/Search.php)并在其中添加:public $useTable = false; [details]告诉它您不会制作{{1}表格。

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

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

SearchesController

然后,在你的订单模型中(按照这个例子),做逻辑的主要内容(下面是粗略的想法):

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

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

答案 2 :(得分:0)

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