2015-01-06 15 views
1

У меня возникла проблема, что я уверен, что это просто из-за меня довольно ржавый пирог. Я пытаюсь создать маршрут по умолчанию или catch-all, который будет соответствовать только в том случае, если все остальные маршруты потерпели неудачу. Я предположил, от моего понять большинство 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('/*') маршрута приводит к конфликту с предыдущими способами. Я также пробовал маршрут «slug», но у меня такая же проблема с конфликтами.

Есть ли какие-либо решения этой проблемы или возможная работа?

Заранее спасибо.

Редактировать

В моем комментарии ниже я связан с комментарием, что при условии достойного решения моей проблемы. Вот мое простое доказательство концепции.

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) предлагает хорошее решение моей проблемы. Я могу писать new routes.php каждый раз, когда добавляю динамическую страницу или изменяю слизню. – NomadCrypto

ответ

0

Когда вы пишете require CAKE . 'Config' . DS . 'routes.php';, вы, в основном, включаете маршруты по умолчанию cakephp, которые уже являются всеми маршрутами. Маршруты сконфигурированные через эту линию среди всего:

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

Все маршруты, которые вы определенные в #... other routes должны еще работать.

Однако, если вы использовали маршруты по умолчанию Cakephp в своем приложении, они теперь переопределены вашим обычным маршрутом «catch-all».

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')); 

Таким образом, вы можете сопоставить все urls, которые не определены в route.php

Смежные вопросы