Ответ
Ответ — то, что приложение отправляет браузеру: текст страницы, код состояния и заголовки. В Slim это объект $response, второй аргумент обработчика. Обработчик дополняет его и обязательно возвращает.
Тело ответа
Тело — содержимое страницы. В него пишут методом write():
// public/index.php
$app->get('/about', function (Request $request, Response $response) {
$response->getBody()->write('<h1>О блоге</h1>');
$response->getBody()->write('<p>Сайт работает на Slim.</p>');
return $response;
});По адресу /about появится заголовок и абзац: каждый вызов write() дописывает текст в конец.
Код состояния
Код состояния сообщает, чем закончился запрос: 200 — успех, 404 — не найдено, 201 — запись создана. По умолчанию код равен 200. Изменяет его метод withStatus():
// public/index.php
$app->get('/missing', function (Request $request, Response $response) {
$response->getBody()->write('Такой страницы нет');
return $response->withStatus(404);
});Текст появится на странице, а в инструментах разработчика браузера, на вкладке «Сеть», у запроса будет код 404.
Заголовки
Заголовок ответа добавляет withHeader():
return $response->withHeader('Content-Type', 'text/plain; charset=utf-8');Content-Type сообщает браузеру вид содержимого: с text/plain он покажет текст как есть, не разбирая теги.
Ответ JSON
JSON — текстовый формат данных, в котором отвечают API. Готового метода в Slim нет: данные превращают в строку функцией json_encode() и добавляют заголовок. Чтобы не повторяться, напишите в public/index.php перед маршрутами свою функцию:
// public/index.php
function json(Response $response, mixed $data, int $status = 200): Response
{
$response->getBody()->write(json_encode($data, JSON_UNESCAPED_UNICODE));
return $response
->withHeader('Content-Type', 'application/json')
->withStatus($status);
}
$app->get('/api/status', function (Request $request, Response $response) {
return json($response, ['status' => 'ok']);
});По адресу /api/status браузер покажет {"status":"ok"}.
Перенаправление
Перенаправление — ответ без содержимого, который отправляет браузер на другой адрес. Это код 302 и заголовок Location:
// public/index.php
$app->get('/old-about', function (Request $request, Response $response) {
return $response
->withHeader('Location', '/about')
->withStatus(302);
});Откройте /old-about — браузер сам перейдёт на /about. Код 301 означает, что страница переехала навсегда.
Частая ошибка
Объекты PSR-7 неизменяемы: методы с приставкой with не меняют объект, а возвращают новый. Строка без присваивания ничего не делает:
$response->withStatus(404); // результат потерян, код останется 200
return $response;Результат нужно сохранить в переменную или сразу вернуть: return $response->withStatus(404);. Исключение — тело: getBody()->write() дописывает текст в тот же объект.