首先,我對此問題的長度表示歉意。我希望儘可能詳細。CakePHP遞歸爲美麗的路由 - 類別,主題,節,小節等
我正在用CakePHP開發一個基於Web的應用程序。過去幾周我一直在做幾個方面的工作,目前正在填充我的數據庫表中的大量信息。用戶應該可以通過漂亮的,用戶友好的URL非常方便地訪問它。假設我有我的Users
和ACO,ARO等全部設置。這與所有問題都是分開的。是我的數據庫這一特定問題的相關方面如下:
類別:首要類別(例如, '貓')
- 每個類別
hasMany
主題
主題:特定主題(例如'Feeding')
- 每個主題
belongsTo
一個類別 - 每個主題
hasMany
節
科:在主題中的部分(例如, '肉')
- 每個節
belongsTo
一個主題 - 每節
hasMany
小節
分段:一個段內的第(例如, '熟')
- 每小段
等等等等belongsTo
一個部分。
我已經在我的/Config/routes.php
文件配置的路由,包括以下內容:
Router::connect('/KnowledgeBase', array('controller' => 'categories', 'action' => 'index'));
Router::connect('/KnowledgeBase/:category', array('controller' => 'categories', 'action' => 'view'));
Router::connect('/KnowledgeBase/:category/:topic', array('controller' => 'topics', 'action' => 'view'));
Router::connect('/KnowledgeBase/:category/:topic/:section', array('controller' => 'sections', 'action' => 'view'));
Router::connect('/KnowledgeBase/:category/:topic/:section/:subsection', array('controller' => 'subsections', 'action' => 'view'));
正如你所看到的,每個URL格式鏈接到一個特定的控制器,使用戶可以鍵入URL,例如http://www.mysite.com/KnowledgeBase/Cats/Feeding/Meat/Cooked或http://www.mysite.com/KnowledgeBase/Cats/Grooming,它會將它們放在正確的頁面上,由正確的控制器處理(分別在這兩個示例中爲subsections
和topics
)。
這是我有點卡住了。這些數據需要驗證。我很有可能會在將來設置主題/部分/子部分具有相同名稱的事情。如果數據未經遞歸驗證,則使用簡單的$params
搜索子部分在理論上會導致問題。
舉個例子,我的狗類: http://www.mysite.com/KnowledgeBase/Cats/Feeding/Meat/Cooked 而不是: http://www.mysite.com/KnowledgeBase/Dogs/Feeding/Meat/Cooked
當我降落在特定的控制器(在這種情況下我SubsectionsController
)我需要只選擇分段標題Cooked
這屬於標題爲Feeding
的Meat
部分,標題爲Dogs
(而不是Cats
,Leopards
,Armadillos
或Dolphins
...我離題)。
什麼是這樣做的最佳方式?到目前爲止,我可以看到兩個可能的選擇:
- 路由所有這些URL一個特定的控制器(例如,一個無所不知
KnowledgeBaseController
),並從那裏使用recursive => 3
呼叫根據請求的數據處理一切。 - 單獨處理此信息,以便我的
SubsectionsController
設置爲,並確保數據具有有效的父項。 - 混合使用這些選項 - 使用中心
KnowledgeBaseController
來驗證數據,使用recursive => X
find查詢,然後將所有這些信息發送到有問題的單個控制器進行查看。
我知道,我的代碼應該儘可能,這將意味着我應該只使用一箇中央控制器驗證URL $params
幹。但是,類別,主題,部分和子部分有非常不同的佈局,我寧願他們由自己的控制器處理,同時保持此URL格式。什麼是最好的方式去做這件事?是否有「最佳實踐」解決方案?
謝謝。
謝謝您的答覆,並澄清它實際上'遞歸= 3'。這是我原本打算做的,但擔心儘可能讓我的代碼儘可能幹。謝謝你的幫助! – DoctorClod