2015-01-06 63 views
1

我遇到了一個問題,我相信它只是從我相當生疏的蛋糕。我正在嘗試創建一個只有在所有其他路由都失敗時才能匹配的默認或全部路由。我從我的假設最瞭解的MVC框架,像下面這樣就足夠了的:CakePHP抓住所有的路線

Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home')); 
#... other routes 
Router::connect('/*', array('controller' => 'pages', 'action' => 'dynamic_display', 'home')); 
CakePlugin::routes(); 
require CAKE . 'Config' . DS . 'routes.php'; 

這樣做的問題是,Router::connect('/*')路線導致與先前路線的衝突。我也嘗試過一個「slu」「的路線,但我遇到了與衝突相同的問題。

有沒有解決這個問題或可能的解決方法?

在此先感謝。

編輯

在我的評論我下面掛的是提供一個體面的解決我的問題的註釋。這是我對概念的簡單證明。

page.php文件

<?php 
App::uses('AppModel', 'Model'); 

/** 
* Page model 
* @uses AppModel 
*/ 
    class Page extends AppModel { 
     /** 
     * MongoDB Schema definitions 
     * 
     * @var array 'mongoSchema' 
     * @link https://github.com/ichikaway/cakephp-mongodb/ 
     */ 
      var $mongoSchema = array(
       'title'=>array('type'=>'string'), 
       'meta_description'=>array('type'=>'text'), 
       'slug'=>array('type'=>'string'), 
       'content'=>array('type'=>'text'), 
       'published'=>array('type'=>'bool'), 
       'created'=>array('type'=>'datetime'), 
      ); 

     /** 
     * afterSave method. 
     * @return void 
     */ 
      public function afterSave($created, $options=array()) { 
       $this->__rebuildRouteCache(); 
      } 

     /** 
     * rebuild route cache method. This will rewrite the routes for our simple CMS each time a page is added or updated 
     * @return void 
     */ 
      private function __rebuildRouteCache() { 
       $pages = $this->find('all'); 
       $filename = TMP . 'cache' . DS . 'routes.php'; 
       $buffer = "<?php \r\n"; 

       foreach($pages as $page) { 
        $buffer .= 'Router::connect("'. $page['Page']['slug'] .'", array("controller" => "pages", "action" => "dynamic_display"));'; 
        $buffer .= "\r\n"; 
       } 

       $buffer .= "?>"; 

       file_put_contents($filename, $buffer); 
      } 



    } 
?> 

routes.php文件

<?php 
#..snip 
/** 
* Include our route cache if it exists 
*/ 
    $fname = TMP . 'cache' . DS . 'routes.php'; 
    if(file_exists($fname)) { 
     require_once $fname; 
    } 


/** 
* Load all plugin routes. See the CakePlugin documentation on 
* how to customize the loading of plugin routes. 
*/ 
    CakePlugin::routes(); 

/** 
* Load the CakePHP default routes. Only remove this if you do not want to use 
* the built-in default routes. 
*/ 
    require CAKE . 'Config' . DS . 'routes.php'; 
?> 

這不是一個包羅萬象的路線一樣,我想,但它是我的情況可行的解決方案。希望這對其他人也有用。

+0

[此評論](http://stackoverflow.com/a/12316219/4425082)爲我的問題提供了一個很好的解決方案。每次添加一個動態頁面或更改一個slu I時,我都可以寫一個新的routes.php。 – NomadCrypto

回答

0

當你寫require CAKE . 'Config' . DS . 'routes.php';你基本上包括cakephp默認路由,它們已經是全部路由。通過這條線配置的路由是在所有:

Router::connect('/:controller', array('action' => 'index')); 
Router::connect('/:controller/:action/*'); 

所有你在#... other routes定義仍然應該工作的路由。但是,如果您在您的應用中使用了CakePHP默認路由,它們現在被您的自定義「全部抓取」路由所覆蓋。

0

在AppController.php中創建一個函數,如下所示。

public function appError($error) { 
    $this->redirect('/catch-all-route',301,false); 
} 

上述功能將趕上不一直在routes.php文件

的所有錯誤頁面現在您可以創建/catch-all-route

Router::connect('/catch-all-route', 
array('controller' => 'pages', 'action' => 'dynamic_display', 'home')); 

這種方式可以匹配所有一個規則未在路由中定義的網址.php