Cakephp 3 с параметром языка

Я пытаюсь преобразовать cakephp 2.x в 3.x. Я использовал правила Router::connect() , но я пытаюсь преобразовать их в версию области.

Что касается правила маршрутизации myold, в config/routes.php я добавил это.

  Router::defaultRouteClass('Route'); Router::scope('/', function ($routes) { $routes->connect('/:language/:controller/:action/*', ['language' => 'ar|de|en|fr']); $routes->connect('/:language/:controller', ['action' => 'index', 'language' => 'ar|de|en|fr']); $routes->connect('/:language', ['controller' => 'Mydefault', 'action' => 'index', 'language' => 'ar|de|en|fr']); $routes->redirect('/gohere/*', ['controller' => 'Mycontroller', 'action' => 'myaction'], ['persist' => array('username')]); $routes->connect('/', ['controller' => 'Mydefault', 'action' => 'index']); $routes->fallbacks('InflectedRoute'); }); 
  • Но это не работает в example.com/en/works . Я получаю эту ошибку: Error: worksController could not be found. Поскольку мой файл контроллера – WorksController.php .

Изменена ли часть имени контроллера для предложения casein cakephp 3? http://book.cakephp.org/3.0/en/intro/conventions.html#controller-conventions

  • Также example.com/foo/bar дает эту ошибку: Error: barController could not be found. , Но foo – это контроллер, а bar – действие.

Как я могу исправить эту проблему маршрутизации?

Редактировать:
Изменение Route::defaultRouteClass('Route') для Route::defaultRouteClass('InflectedRoute') решает проблему 1. Но проблема 2 существует.

Solutions Collecting From Web of "Cakephp 3 с параметром языка"

Параметры, такие как шаблоны элементов маршрута, должны передаваться через третий аргумент Router::connect() , аргумент $options .

Этот маршрут

 $routes->connect('/:language/:controller', ['action' => 'index', 'language' => 'ar|de|en|fr']); 

поймает ваш URL-адрес /foo/bar , он будет соответствовать foo для элемента :language и bar для элемента :controller .

Правильный способ определения маршрута

 $routes->connect( '/:language/:controller', ['action' => 'index'], ['language' => 'ar|de|en|fr'] ); 

Другие маршруты необходимо соответствующим образом адаптировать.

См. Также Поваренная книга> Маршрутизация> Подключение маршрутов

Лучший способ – использовать области маршрутизации

 <?php $builder = function ($routes) { $routes->connect('/:action/*'); }; $scopes = function ($routes) use ($builder) { $routes->scope('/questions', ['controller' => 'Questions'], $builder); $routes->scope('/answers', ['controller' => 'Answers'], $builder); }; $languages = ['en', 'es', 'pt']; foreach ($languages as $lang) { Router::scope("/$lang", ['lang' => $lang], $scopes); } Router::addUrlFilter(function ($params, $request) { if ($request->param('lang')) { $params['lang'] = $request->param('lang'); } return $params; }); 

Код, взятый из:

https://github.com/steinkel/cakefest2015/blob/c3403729d7b97015a409c36cf85be9b0cc5c76ef/cakefest/config/routes.php