У меня есть настройка контроллера, чтобы принять два vars: /clients/view/var1/var2
И я хочу показать его как /var1/var2
Я пытаюсь
Router::connect('/*', array('admin'=>false, 'controller' => 'clients', 'action' => 'view'));
Но это останавливает все остальные контроллеры, работающие как /*
все маршруты
Все остальные страницы, находящиеся на сайте, находятся в префиксе admin
поэтому в основном мне нужен маршрут, который игнорируется, если текущий префикс – это admin
! Я попробовал это (регулярное выражение из регулярного выражения для соответствия строке, которая не содержит слова? ):
Router::connect('/:one', array('admin'=>false, 'controller' => 'clients', 'action' => 'view'), array( 'one' => '^((?!admin).*)$' ));
Но я думаю, что регулярное выражение неверно, потому что, если я нахожусь в /test
он запрашивает контроллер тестов, а не клиенты
Мои другие маршруты:
Router::connect('/admin', array('admin'=>true, 'controller' => 'clients', 'action' => 'index')); Router::connect('/', array('admin'=>false, 'controller' => 'users', 'action' => 'login'));
Что я делаю не так? Благодарю.
Я неправильно понял ваш вопрос в первый раз. Я проверил ваш код и не получил ожидаемого результата. Причина может заключаться в том, что парсер регулярных выражений не поддерживает отрицательное утверждение . Но я все еще думаю, что вы можете решить эту проблему с изменением маршрутов:
CakeBook описывает, какие маршруты автоматически генерируются, если вы используете префиксную маршрутизацию . В вашем случае эти маршруты должны быть назначены вручную перед маршрутом '/ *', чтобы поймать все действия администратора. Вот код, который работал для меня:
// the previously defined routes Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home')); Router::connect('/admin', array('controller' => 'clients', 'action' => 'index', 'admin' => true)); // prefix routing default routes with admin prefix Router::connect("/admin/:controller", array('action' => 'index', 'prefix' => 'admin', 'admin' => true)); Router::connect("/admin/:controller/:action/*", array('prefix' => 'admin', 'admin' => true)); // the 'handle all the rest' route, without regex Router::connect( '/*', array('admin'=>false, 'controller' => 'clients', 'action' => 'view'), array() );
Теперь я получаю все свои действия с администратором, префикс администратора и / test1 / test2 перенаправляется на клиентский контроллер.
Я думаю, что решение описано в статье пекарни о маршрутизации – «Передача параметров в действие» (код не проверен):
Router::connect( '/clients/view/:var1/:var2/*', array( 'controller' => 'clients', 'action' => 'view' ), array( 'pass' => array( 'var1', 'var2' ) ) );
Действие контроллера будет выглядеть так:
public function view($var1 = null, $var2 = null) { // do controller stuff }
Также вы также смотрите на порядок ваших маршрутов (см. Раздел «Порядок маршрутов»). В вашем примере «/ *» останавливает все остальные маршруты, если он на первом месте, если вы назначаете правило после остальных, он обрабатывает только запросы, которые не соответствуют другому маршруту.