2012-04-17 68 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