Encodera

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

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

Оглавление

Имена маршрутов и группы

Адреса в проекте со временем меняются: /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() забыли вызвать. Имена должны быть уникальны: два маршрута с одним именем не различить.

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

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