Маршрутизатор CakePHP, маршрут не работает

#cakephp #routing

#cakephp #маршруты

Вопрос:

У меня есть этот маршрут:

 Router::connect(
    '/:controller/*',
    array('controller'=>'con3'),
    array('controller'=>'con1|con2')
            );
  

Я пытаюсь направлять каждый вызов на

 /con1/x1/x2
  

Для

 /con3/x1/x2
  

и

 /con2/y1/y2
  

Для

 /con3/y1/y2
  

он не работает, почему?

Ответ №1:

Если вам требуется проложить маршрут /con3/ к /con1/ и / или /con2/ на основе ваших собственных ограничений, вам потребуется пользовательский Route class . Для этого нет лучшего места, чем руководство Марка Стори по пользовательским Route классам.

В противном случае, вы могли бы, конечно, просто расширить свои контроллеры (и оставить тело пустым) следующим образом:

 <?php
class Con3Controller extends Con1Controller{
    // maybe add model here if you don't have
    // var $uses in Con1Controller
    // otherwise, extend is just fine
}
?>
  

В этом случае вам не нужно возиться с маршрутами подключения, как сейчас. Наследование объектов позаботится о вашем «сглаживании» за вас.

Комментарии:

1. Спасибо @Oerd, но как мне расширить con3 из con1 И из con2?

2. @yossi множественное наследование — это не то, что вы можете получить из коробки в PHP 🙂 Теперь, когда я думаю, что лучше понимаю ваши требования, я обновил свой ответ.

3. вероятно, это и есть ответ… позор мне, ожидающему, что cake предложит встроенное решение 🙂 спасибо

Ответ №2:

Рассматривали ли вы что-то вроде:

 Router::connect( '/con1/:action/*', array( 'controller' => 'con3' ) );
Router::connect( '/con2/:action/*', array( 'controller' => 'con3' ) );
  

Комментарии:

1. это грязно.. у меня есть 8 контроллеров, каждый из которых имеет до 10 псевдонимов.

2. @yossi наличие 10 псевдонимов для каждого контроллера не совсем «чисто»: P В будущем ситуация может выйти из-под контроля, если вам потребуется обновить свой код

3. Действительно, но поскольку он основан на ключевых словах (как «категории»), у меня нет другого выбора. единственный другой способ — использовать htaccess .. и это худший