2012-04-17 75 views
3

我有一个简单的Web应用程序,其中包含数据库表ordersproducts,我正在使用CakePHP重新进行操作。还有更多,但为了简单起见,我在这里只使用这两个。在网络应用程序中,我希望能够搜索项目,搜索订单以及执行与订单有关的工作,但是我无法设置和选择用于制作此Web应用程序的组件。作为我的问题的一个例子,我有以下页面。查看下面的布局。CakePHP:适当的控制器,模型和操作结构

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

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

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

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

  3. 如果我的方法(从1和2开始)效率不高,错误或不正确,您是否可以建议一个好的结构来设置这个特定的页面,关于要使用哪个控制器以及控制器应该如何使用模型和他们的行为?

+0

谢谢大家的答案!我将为此使用'SearchController'。 – musicliftsme 2012-04-18 16:07:54

回答

1

TLDR:

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

我的喜好和推理

我将创建一个SearchesController。这对于组织目的来说是最有意义的。所有的搜索功能可以在同一个控制器中,所有的搜索视图都将位于“Views/Searches /”文件夹中,并且任何/所有相关的CSS和javascript都可以在/css/searches/js/searches/(如果您喜欢像这样组织我做)。

您也想进行搜索模型(Models/Search.php),并在它内部添加:public $useTable = false;[details]告诉它你不会做出searches表。

在每一个SearchController的操作,如function orders()function products(),你可以使用$this->loadModel('Order');[details],使这些车型从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); 
} 

保持你的所有控制器动作组合可以让你更轻松地进行全面调整 - 就像如果你想设置每页结果改变一个变量所有搜索页面等。我相信还有很多其他想法,但底线,它保持类似的代码。

+0

当你说“不要使用'页面控制器”时,你是说当用户点击菜单上的“搜索”时,我应该直接去''搜索'控制器?因此,当点击“搜索”时,URL会转到“myapp/searches/products”,完全绕过“页面”控制器。 – musicliftsme 2012-04-18 18:46:33

+0

正确。 Pages控制器用于静态内容(例如,关于我们的页面)。 – Dave 2012-04-18 18:49:29

+0

好吧,所以我完成了这个工作,我在搜索表单('views/searches/products.ctp')下面显示搜索结果,但是我不认为我自然可以在这里使用'Paginator'。 '$ this-> find()'在此模型中完成,但$ this-> paginate()需要在控制器中完成,而我的控制器没有这些搜索逻辑。在模型中使用搜索逻辑时,如何在视图中对我的搜索结果进行分页? – musicliftsme 2012-04-18 19:39:34

0
  1. 你并不需要创建一个新的控制器。您可以拥有相同的控制器(称为产品)并在该控制器上使用称为搜索的操作。所以,你的链接将指向/产品/搜索
  2. 甚至创造一个新的控制器,你可以通过导入其相应的控制器
  3. 我会建议什么蛋糕通常做的棒访问其他车型,为每个型号的控制器你有你的应用程序。通常,每个模型应该是一个类,它表示您正在翻译到系统中的场景的实体(物理或逻辑),并且您将为每种方法都有一个控制器。
+0

所以,如果我采取了你的方法,我们将在这个搜索页面中的'myapp/product/search'和'myapp/order/search'之间,取决于我搜索的内容。这可以? – musicliftsme 2012-04-17 22:49:39

+0

是的,这将是上面描述的方法 – pollirrata 2012-04-17 22:57:34

1

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

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

+0

你能详细说明另一个控制器背后的原因吗?从我一直在阅读的内容来看,这种方法对我来说更有意义,但我无法准确解释为什么它处于我目前的知识状态。 – musicliftsme 2012-04-17 23:45:33

+0

你想把它分成另一个控制器,这样你就可以统一你的搜索过程。如果您决定添加搜索“客户”之类的其他模型,则更容易管理。而且我宁愿让网址以搜索开始并且更加一致。 – Jack 2012-04-18 01:04:17