Я пытаюсь преобразовать 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 существует.
Параметры, такие как шаблоны элементов маршрута, должны передаваться через третий аргумент 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; });
Код, взятый из: