Имена маршрутов и группы
Адреса в проекте со временем меняются: /posts/5 может стать /articles/5. Чтобы не исправлять каждую ссылку, маршруту дают имя и строят адрес по имени. А маршруты с общим началом адреса объединяют в группу, чтобы не повторять это начало.
Имя маршрута
Имя задаёт метод setName() — его вызывают сразу после объявления маршрута:
// public/index.php
$app->get('/posts/{id:[0-9]+}', function (Request $request, Response $response, array $args) {
$response->getBody()->write('Статья №' . $args['id']);
return $response;
})->setName('posts.show');Маршрут работает как раньше, но теперь на него можно сослаться по имени posts.show. Имя — любая строка; удобно писать «раздел.действие».
Ссылка по имени
Адрес по имени строит объект RouteParser. Внутри обработчика его получают из запроса:
// public/index.php
use Slim\Routing\RouteContext;
$app->get('/', function (Request $request, Response $response) {
$parser = RouteContext::fromRequest($request)->getRouteParser();
$url = $parser->urlFor('posts.show', ['id' => 5]);
$response->getBody()->write('<a href="' . $url . '">Пятая статья</a>');
return $response;
});На главной странице появится ссылка на /posts/5. Строку use добавляют в начало файла, рядом с остальными.
| Вызов | Результат |
|---|---|
urlFor('posts.show', ['id' => 5]) | /posts/5 |
urlFor('posts.show', ['id' => 5], ['ref' => 'home']) | /posts/5?ref=home |
fullUrlFor($request->getUri(), 'posts.show', ['id' => 5]) | http://localhost:8080/posts/5 |
Второй аргумент — значения параметров адреса, третий — параметры после знака вопроса.
Группа
Группа объявляет общее начало адреса один раз. Внутри группы маршруты добавляют к объекту $group:
// public/index.php
use Slim\Routing\RouteCollectorProxy;
$app->group('/admin', function (RouteCollectorProxy $group) {
$group->get('/posts', function (Request $request, Response $response) {
$response->getBody()->write('Управление статьями');
return $response;
});
$group->get('/users', function (Request $request, Response $response) {
$response->getBody()->write('Пользователи');
return $response;
});
});Получатся адреса /admin/posts и /admin/users. Если начало изменится на /panel, исправить нужно одну строку.
Имена внутри группы
Маршрутам в группе имена дают так же:
$group->get('/posts', $handler)->setName('admin.posts');Здесь $handler — любая функция-обработчик. Вызов urlFor('admin.posts') вернёт /admin/posts: начало группы подставляется само.
Зачем ещё нужны группы
Группы можно вкладывать друг в друга, а главное — к группе можно привязать посредник: код, который выполняется перед всеми её маршрутами, например проверку входа для всего раздела /admin. Посредникам посвящён отдельный урок.
Частая ошибка
Если вызвать urlFor() с именем, которого нет, или не передать обязательный параметр, Slim бросит исключение — страница упадёт с ошибкой 500. Чаще всего причина в опечатке в имени или в том, что setName() забыли вызвать. Имена должны быть уникальны: два маршрута с одним именем не различить.