[英]CakePHP: proper controllers, models, and actions structure
我有一个简单的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
模型。 这些模型中的每一个都具有其各自的DB表的搜索逻辑。 如果为上面的页面创建了一个新的控制器,那么该控制器可以简单地使用这些模型的操作吗? 我正在阅读控制器和模型分离是完全正常的,实际上是一件好事。 起初我以为他们在一起,但我越熟悉CakePHP,它似乎恰恰相反。
如果我的方法(从1和2)不低效,错误或不正确,你能建议一个好的结构来设置这个特定的页面,关于使用什么控制器以及控制器应该如何使用模型及其行为?
我建议你使用另一个搜索控制器。 在搜索控制器内部,在类级别只需添加此行var $uses = array('Order', 'Product');
这样您就可以访问订单和产品表。
只需使用$this->Order->find()
和$this->Product->find()
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
访问这些模型,然后运行您的搜索。
为了坚持“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);
}
将所有控制器操作保持在一起可以让您更轻松地进行全面更改 - 例如,如果您想为每页更改所有搜索页面的结果设置单个变量等等。 我确信还有很多其他的想法,但最重要的是,它将类似的代码放在一起。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.