2013-01-23 12 views
1

首先,我對此問題的長度表示歉意。我希望儘可能詳細。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/Cookedhttp://www.mysite.com/KnowledgeBase/Cats/Grooming,它會將它們放在正確的頁面上,由正確的控制器處理(分別在這兩個示例中爲subsectionstopics)。

這是我有點卡住了。這些數據需要驗證。我很有可能會在將來設置主題/部分/子部分具有相同名稱的事情。如果數據未經遞歸驗證,則使用簡單的$params搜索子部分在理論上會導致問題。

舉個例子,我的狗類: http://www.mysite.com/KnowledgeBase/Cats/Feeding/Meat/Cooked 而不是: http://www.mysite.com/KnowledgeBase/Dogs/Feeding/Meat/Cooked

當我降落在特定的控制器(在這種情況下我SubsectionsController)我需要只選擇分段標題Cooked這屬於標題爲FeedingMeat部分,標題爲Dogs(而不是CatsLeopardsArmadillosDolphins ...我離題)。

什麼是這樣做的最佳方式?到目前爲止,我可以看到兩個可能的選擇:

  1. 路由所有這些URL一個特定的控制器(例如,一個無所不知KnowledgeBaseController),並從那裏使用recursive => 3呼叫根據請求的數據處理一切。
  2. 單獨處理此信息,以便我的SubsectionsController設置爲​​,並確保數據具有有效的父項。
  3. 混合使用這些選項 - 使用中心KnowledgeBaseController來驗證數據,使用recursive => X find查詢,然後將所有這些信息發送到有問題的單個控制器進行查看。

我知道,我的代碼應該儘可能,這將意味着我應該只使用一箇中央控制器驗證URL $params幹。但是,類別,主題,部分和子部分有非常不同的佈局,我寧願他們由自己的控制器處理,同時保持此URL格式。什麼是最好的方式去做這件事?是否有「最佳實踐」解決方案?

謝謝。

回答

2

首先,你列出的路線應該是相反的順序。頂部最具體的路線,底部最通用。

您應該使用選項#2。由其自己的控制器管理的每個級別的層次結構。所以採取例如。層次結構小節的最下一級的你有這方面的SubSectionsController,做一個找到它的分段模型與適當的遞歸值來獲得它的相關部分,該部分的題目等等(順便說一句,這將是遞歸= 3仍,沒有遞歸= -3這樣的東西)。因此,您可以通過這種方式獲得層次結構的所有記錄,並且可以使用層次結構的相關記錄驗證每個網址片段。 $this->request->params將爲您的路線的每個路線元素包含一個鍵。

+0

謝謝您的答覆,並澄清它實際上'遞歸= 3'。這是我原本打算做的,但擔心儘可能讓我的代碼儘可能幹。謝謝你的幫助! – DoctorClod