2013-02-03 36 views
1

我使用CakePHP 2+和我所說的「職位」的模型,和帖子可以是不同類型,例如 - 博客文章,消息等CakePHP的路由多個職位類型

配置/routes.php,如何設置我的路由,以便我有/posts/12/post-title/blog/14/blog-title

目前,我有這樣的:

Router::connect('/:type/add', array('controller' => 'posts', 'action' => 'add'), 
    array('pass' => array('type'))); 

Router::connect('/:type/:action', array('controller' => 'posts'), 
    array('pass' => array('type'))); 

# Custom posts router 
Router::connect('/:type/:id/:slug', 
array('controller' => 'posts', 'action' => 'view'), 
    array('pass' => array('type', 'id', 'slug'), 'id' => '[0-9]+')); 

但問題是,這是再用於每個URL,這樣的CakePHP認爲我的用戶個人資料頁應看我的帖子控制器,因爲它認爲的我」中號傳遞一個:型 -

...

#View Profile 
Router::connect('/profile/:id', array('controller' => 'users', 'action' => 'view'), 
    array('pass' => array('id'), 'id' => '[0-9]+')); 

有誰知道正確這樣的手段?非常感謝

回答

1

首先,在爲了您的路線事,如果多條路線將匹配的URL,第一個匹配的路徑將被處理

接下來,你可以限制「是什麼」將被視爲通過在Router :: connect()的最後一個參數中爲'type'鍵設置一個正則表達式,'type'就像'id'一樣。您可能能夠在正則表達式中包含所有有效類型,例如向正則表達式添加一個'負'部分,排除值,例如,控制器名稱

事情是這樣的:

Router::connect(
    '/:type/:action', 
    array(
     'controller' => 'posts', 
    ), 
    array(
     /** 
      * Custom type: 
       * only allow 'post', 'blog' or 'message' as type here 
       * to prevent overlapping with 'controllers' 
      */ 
     'type' => '(post|blog|message)', 

     // Define what should be passed to the 'view' action as arguments 
     'pass' => array('type'), 

     /** 
      * Optionally, define what parameters should be automatically preserved 
      * when creating URLs/links 
      */ 
     'persist' => array('type'), 
    ) 
); 

Router::connect(
    '/:type/:id/:slug', 
    array(
     'controller' => 'posts', 
     'action'  => 'view', 
    ), 
    array(
     /** 
      * Custom type: 
       * only allow 'post', 'blog' or 'message' as type here 
       * to prevent overlapping with 'controllers' 
      */ 
     'type' => '(post|blog|message)', 
     'id'  => '[0-9]+', 

     // Define what should be passed to the 'view' action as arguments 
     'pass'   => array('type', 'id', 'slug'), 

     /** 
      * Optionally, define what parameters should be automatically preserved 
      * when creating URLs/links 
      */ 
     'persist' => array('type'), 
    ) 
); 
+0

阿OK聽起來不錯,如果你可以用一個例子,這將是真棒:) – Tim

+0

@Tim我加了一些例子更新,但你需要測試EM和提到,順序也可能很重要 – thaJeztah