#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 .. и это худший