【问题标题】:CakePHP: proper controllers, models, and actions structureCakePHP:适当的控制器、模型和动作结构
【发布时间】:2012-04-29 07:46:06
【问题描述】:

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

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

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

  1. 控制器:对于这个搜索页面,应该使用哪些控制器?我现在默认为静态页面使用PagesController,但是这个搜索页面真的应该使用PagesController吗?我也有 ProductsControllerOrdersController,它们是在我创建 ProductOrder 模型时创建的,但使用全新的控制器似乎更合适,也许是一个名为 SearchController 的控制器。这样,URL 就会保持在myapp/search/... 之下,并且不会到处乱窜。这是正确的方法吗? (我知道我可以重写 URL,但那是以后的事了)

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

  3. 1234563模型及其行为?

【问题讨论】:

  • 感谢大家的回答!为此,我会选择SearchController

标签: php model-view-controller cakephp


【解决方案1】:
  1. 您不需要为此创建新的控制器。您可以在该控制器上拥有相同的控制器(例如 Products)和一个名为 Search 的操作。因此,您的链接将指向 /Products/Search
  2. 即使创建新控制器,您也可以通过导入相应的控制器来访问其他模型
  3. 我建议坚持 Cake 通常做的事情,为应用程序中的每个模型创建一个控制器。通常,每个模型都应该是一个类,代表您要转换到系统中的场景中的实体(物理或逻辑),并且您将拥有每个方法的控制器。

【讨论】:

  • 因此,如果我采用您的方法,我们将在此搜索页面内的 myapp/product/searchmyapp/order/search 之间切换,具体取决于我搜索的内容。这样好吗?
  • 是的,这就是上面描述的方法
【解决方案2】:

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

只需使用$this-&gt;Order-&gt;find()$this-&gt;Product-&gt;find()

【讨论】:

  • 您能否详细说明另一个控制器背后的原因?根据我一直在阅读的内容,这种方法对我来说更有意义,但我无法准确解释为什么它处于我目前的知识状态。
  • 您想将其分离到另一个控制器中,以便统一您的搜索过程。如果您决定添加其他模型,例如搜索“客户”或其他内容,则更易于管理。而且我更希望 URL 以搜索开头并且更加一致。
【解决方案3】:

TLDR:

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

我的偏好和理由

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

您还需要创建一个搜索模型 (Models/Search.php) 并在其中添加:public $useTable = false; [details] 告诉它您不会创建 searches 表。

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

为了坚持“胖模型,瘦控制器”的口号,我建议保持你的控制器代码小 - 像这样:

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

然后,在您的 Order 模型中(根据此示例),执行逻辑的核心(以下是粗略的想法):

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

将所有控制器操作放在一起可以让您更轻松地进行全面更改 - 例如,如果您想为每个页面的结果设置一个变量来更改所有搜索页面......等等。我敢肯定还有很多其他的想法,但归根结底,就是将相似的代码放在一起。

【讨论】:

  • 当你说“不要使用Pages控制器”时,你是说当用户点击菜单上的“搜索”时我应该直接去Searches控制器吗?因此,当点击“搜索”时,URL 会转到myapp/searches/products,完全绕过Pages 控制器。
  • 正确。 Pages 控制器用于静态内容(例如 About Us 页面)。
  • 好的,所以我完成了这个,我在搜索表单下方显示了搜索结果 (views/searches/products.ctp),但我认为我不能自然地在这里使用 Paginator$this-&gt;find() 正在这里的模型中完成,但 $this-&gt;paginate() 需要在控制器中完成,而我的控制器没有这些搜索逻辑。在模型中有搜索逻辑的同时,如何在视图中对搜索结果进行分页?
  • 将此作为另一个问题发布,我很乐意回答(在评论中回答太多了,但我在我的项目中就是这样做的,所以 - 不要担心 -它有效。:)(在此处发布指向您的新问题的链接,我会回答)
  • 精湛的戴夫!这里:stackoverflow.com/questions/10217087/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多