Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Маршруты

Маршрут — правило, которое связывает адрес страницы с методом контроллера. Все маршруты проекта описаны в одном файле — 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() включает общее правило «контроллер/метод/аргументы»:

АдресЧто вызывается
/articlesArticlesController::index()
/articles/addArticlesController::add()
/articles/view/5ArticlesController::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() — последней строкой.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.