我有一个简单的Web应用程序,其中包含orders
数据库表和products
,我正在使用CakePHP重新编写。还有更多,但为简单起见,我在这里只使用这两个。在 Web 应用程序中,我希望能够搜索项目、搜索订单和执行与订单相关的工作,但我在设置和选择要用于制作此 Web 应用程序的组件时遇到困难。作为我问题的一个例子,我有以下页面。查看下面的布局。
|------------------------------|
| My App |
|------------------------------|
|Search <--| search order |
|Orders | search product |
|etc. | |
| | |
| | |
|------------------------------|
图:左侧导航栏和正文所示。箭头表示我们所在的页面。
- 控制器
:对于此搜索页面,应使用哪些控制器?我现在默认为静态页面
PagesController
,但这个搜索页面真的应该使用PagesController
吗?我也有在创建Product
和Order
模型时创建的ProductsController
和OrdersController
,但使用一个全新的控制器似乎更合适,也许是一个叫做SearchController
的控制器。这样,URL就保持在myapp/search/...
下,不会到处都是。这是正确的方法吗?(我知道我可以重写 URL,但那是以后的事了)模型和操作:我有
Product
和Order
模型。其中每个模型都有其各自数据库表的搜索逻辑。如果为上述页面创建了一个新控制器,那么该控制器可以简单地使用这些模型的操作,对吗?我正在阅读控制器和模型分离是完全正常的,实际上是一件好事。起初我以为它们是一起的,但我对 CakePHP 越熟悉,似乎恰恰相反。如果我的方法(从 1 和 2)不是低效、错误或不恰当的,您能否建议一个好的结构来设置这个特定页面,说明使用什么控制器以及控制器应该如何使用模型及其操作?
TLDR:
真正的答案是——个人喜好。 无论您创建SearchesController
还是使用ProductsController
和OrdersController
(但不要使用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()
- 您无需为此创建新的控制器。您可以在该控制器上使用相同的控制器(例如产品)和名为"搜索"的操作。因此,您的链接将指向/产品/搜索
- 即使创建新的控制器,您也可以通过导入相应的控制器来访问其他模型
- 我建议坚持 Cake 通常做的事情,为应用程序上的每个模型创建一个控制器。通常,每个模型都应该是一个类,该类表示要转换为系统的方案中的实体(物理或逻辑),并且每个方法都有一个控制器。