Маршруты
Маршрут — правило, которое связывает адрес страницы с методом контроллера. Все маршруты проекта описаны в одном файле — config/routes.php. Он уже есть в новом проекте, создавать его не нужно.
Простой маршрут
// config/routes.php
use Cake\Routing\RouteBuilder;
return function (RouteBuilder $routes): void {
$routes->scope('/', function (RouteBuilder $builder): void {
$builder->connect('/hi', ['controller' => 'Hello', 'action' => 'index']);
$builder->fallbacks();
});
};connect() принимает адрес и массив с именем контроллера и метода. Теперь страница из первого урока открывается и по адресу /hi: он вызывает метод index() класса HelloController.
Маршруты по умолчанию
Строка fallbacks() включает общее правило «контроллер/метод/аргументы»:
| Адрес | Что вызывается |
|---|---|
/articles | ArticlesController::index() |
/articles/add | ArticlesController::add() |
/articles/view/5 | ArticlesController::view(5) |
Поэтому страница /hello из первого урока заработала без маршрута. Свои маршруты пишут, только когда нужен другой адрес.
Параметры
Часть адреса в фигурных скобках — параметр:
$builder->connect('/articles/{id}', ['controller' => 'Articles', 'action' => 'view'])
->setPass(['id'])
->setPatterns(['id' => '\d+']);setPass() передаёт параметр в аргумент метода view($id). setPatterns() ограничивает его регулярным выражением: /articles/5 подойдёт, а /articles/abc — нет.
Имя маршрута
$builder->connect(
'/articles/{id}',
['controller' => 'Articles', 'action' => 'view'],
['_name' => 'articles:view', 'pass' => ['id'], 'id' => '\d+'],
);Третий аргумент — настройки маршрута; ключ _name задаёт имя, по которому на маршрут можно ссылаться.
Группы адресов
scope() задаёт общее начало адреса для нескольких маршрутов:
$routes->scope('/blog', function (RouteBuilder $builder): void {
$builder->connect('/', ['controller' => 'Articles', 'action' => 'index']);
$builder->connect('/new', ['controller' => 'Articles', 'action' => 'add']);
});Получатся адреса /blog и /blog/new.
Построение ссылок
Адрес не пишут строкой — его строят из тех же данных, что и маршрут:
use Cake\Routing\Router;
$url = Router::url(['controller' => 'Articles', 'action' => 'view', 5]);
$url = Router::url(['_name' => 'articles:view', 'id' => 5]);Обе строки вернут /articles/5. Если адрес в маршруте изменится, ссылки изменятся вместе с ним. В шаблонах то же делает помощник Html — о нём в уроке про макеты.
Проверка
bin/cake routesКоманда печатает таблицу всех маршрутов: имя, адрес, контроллер и метод.
Частая ошибка
CakePHP проверяет маршруты сверху вниз и берёт первый подходящий. Если fallbacks() или маршрут с параметром стоит выше конкретного адреса, до нижнего очередь не дойдёт. Ставьте конкретные адреса вверху, а fallbacks() — последней строкой.