Маршруты
Маршрут — правило «на такой метод 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-]+} — или разными началами адреса.