Encodera

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

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

Оглавление

Маршруты

Маршрут — правило «на такой метод HTTP и такой адрес выполнить такой код». Пока проект состоит из одного файла, маршруты объявляют в public/index.php между созданием приложения и строкой $app->run();.

Простой маршрут

// public/index.php
$app->get('/posts', function (Request $request, Response $response) {
    $response->getBody()->write('Список статей');
 
    return $response;
});

По адресу http://localhost:8080/posts появится строка «Список статей». Функцию, которая формирует ответ, называют обработчиком маршрута.

Методы HTTP

Браузер отправляет запросы разными методами: GET — открыть страницу, POST — отправить форму. У каждого метода свой метод приложения:

ВызовДля чего обычно используют
$app->get()Показать страницу или данные
$app->post()Создать запись, принять форму
$app->put(), $app->patch()Изменить запись
$app->delete()Удалить запись
$app->map(['GET', 'POST'], ...)Один обработчик на несколько методов
$app->any()Любой метод

Один адрес может по-разному отвечать на разные методы: GET /posts покажет список, а POST /posts создаст статью.

Параметр в адресе

Часть адреса в фигурных скобках — параметр. Его значение приходит в третьем аргументе обработчика, массиве $args:

// public/index.php
$app->get('/posts/{id}', function (Request $request, Response $response, array $args) {
    $response->getBody()->write('Статья №' . (int) $args['id']);
 
    return $response;
});

Адрес /posts/5 выведет «Статья №5». Значение параметра всегда строка, поэтому число приводят через (int).

Ограничение параметра

После двоеточия пишут регулярное выражение — шаблон, которому должно соответствовать значение:

// public/index.php
$app->get('/posts/{id:[0-9]+}', function (Request $request, Response $response, array $args) {
    $response->getBody()->write('Статья №' . $args['id']);
 
    return $response;
});

[0-9]+ означает «одна или несколько цифр». Адрес /posts/5 подойдёт, а на /posts/abc Slim ответит ошибкой 404.

Необязательная часть

Часть адреса в квадратных скобках можно не указывать:

// public/index.php
$app->get('/news[/{page:[0-9]+}]', function (Request $request, Response $response, array $args) {
    $page = (int) ($args['page'] ?? 1);
 
    $response->getBody()->write("Новости, страница $page");
 
    return $response;
});

Маршрут сработает и для /news, и для /news/3. Когда части нет, ключа page в $args тоже нет — поэтому значение по умолчанию задают через ??.

Проверка других методов

Браузер из адресной строки отправляет только GET. Остальные методы удобно проверять из терминала программой curl:

curl -X POST http://localhost:8080/posts

Если для адреса есть маршрут, но с другим методом, Slim ответит ошибкой 405 «Method Not Allowed».

Частая ошибка

Два маршрута с одинаковым методом и одинаковым шаблоном объявить нельзя: /posts/{id} и /posts/{slug} для Slim — один и тот же адрес, и приложение завершится ошибкой. Разведите их ограничениями — {id:[0-9]+} и {slug:[a-z-]+} — или разными началами адреса.

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

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