CakePHP маршрут с регулярным выражением

У меня есть настройка контроллера, чтобы принять два 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 } 

Также вы также смотрите на порядок ваших маршрутов (см. Раздел «Порядок маршрутов»). В вашем примере «/ *» останавливает все остальные маршруты, если он на первом месте, если вы назначаете правило после остальных, он обрабатывает только запросы, которые не соответствуют другому маршруту.