3

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

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

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

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

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

  3. 如果我的方法(从 1 和 2 开始)不是低效、错误或不合适的,您能否建议一个好的结构来设置这个特定页面,以说明要使用哪些控制器以及控制器应该如何使用模型及其操作?

4

3 回答 3

1

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

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

于 2012-04-17T23:01:39.230 回答
1

TLDR:

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

我的偏好和推理

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

您还需要创建一个 Search 模型 ( 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);

然后,在您的 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);
}

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

于 2012-04-18T03:58:58.920 回答
0
  1. 您不需要为此创建新的控制器。您可以在该控制器上拥有相同的控制器(例如 Products)和一个名为 Search 的操作。所以您的链接将指向 /Products/Search
  2. 即使创建一个新的控制器,您也可以通过导入它们对应的控制器来访问其他模型
  3. 我会建议坚持 Cake 通常做的事情,为应用程序中的每个模型创建一个控制器。通常,每个模型都应该是一个类,代表您要转换到系统中的场景中的实体(物理或逻辑),并且您将拥有每个方法的控制器。
于 2012-04-17T22:45:19.683 回答