Каждая HTTP-сессия определяется двумя вещами: запросом и ответом. Запрос формируется клиентом, например, браузером, а ответ — сервером.
В PHP для работы с http-сессией встроено множество глобальных массивов, но их использование во фреймворках не допускается. Это технически можно, но это «злое» программирование.
И запрос и ответ в Slim представлены двумя объектами, которые передаются в каждый обработчик маршрута.
<?php
$app->get('/', function ($request, $response) {
$response->getBody()->write('Hello, world!');
return $response;
});
$request
используется для извлечения данных запроса, например, заголовков или содержимого отправленной формы. У запроса нет сеттеров. Его уже выполнили и он не может поменяться.
<?php
// Возвращает все заголовки
$request->getHeaders();
В противоположность этому $response
используется для формирования ответа и в процессе работы наполняется данными: заголовками и телом.
<?php
// Устанавливает код ответа
$response->withStatus(204);
Тело ответа хранится внутри $response
как объект, который можно получить через метод getBody()
. А метод write()
записывает данные в этот объект. Такая структура объектов выбрана не просто так. HTTP позволяет отдавать данные потоком (чанками), для которых нужны свои методы работы.
Несмотря на то, что объект с телом ответа может меняться, сам $response
никогда не изменяется. Любой его метод формирует новый $response
:
<?php
$app->get('/', function ($request, $response) {
// Возвращается новый объект
$response2 = $response->withStatus(204);
return $response2;
});
Если не знать этого, можно легко допустить такую ошибку:
<?php
$app->post('/users', function ($request, $response) {
$response->withStatus(302);
return $response;
});
В этом коде withStatus()
возвращает новый $response
, который не используется, а наружу возвращается старый. Если попробовать выполнить запрос к этому обработчику, то он вернет изначально переданный в функцию $response
.
Параметры запроса
Параметры запроса не являются частью маршрута и не влияют на выбор обработчика. Связано это с тем, что такие параметры используются для различных вспомогательных целей, например, параметр page
обозначает страницу просматриваемого списка. Обработчик в такой ситуации всегда один и тот же, а вот данные показываются разные.
curl 'localhost:8080/users?page=4&per=3'
GET /users
Параметры извлекаются из объекта $request
несколькими способами:
getQueryParams()
— извлекает все параметрыgetQueryParam($name, $defaultValue)
— извлекает значение конкретного параметра. Вторым параметром принимает значение по умолчанию
<?php
$app->post('/users', function ($request, $response) {
$page = $request->getQueryParam('page', 1);
$per = $request->getQueryParam('per', 10);
// Тут обработка
return $response;
});
Количество обработчиков и маршрутов, которые можно добавить, не ограничено. При этом микрофреймворки не задают никакой структуры. Если кода становится много, то разделять его по файлам придется самостоятельно.
Самостоятельная работа
Добавьте в index.php следующий обработчик:
<?php $app->post('/users', function ($request, $response) { return $response->withStatus(302); });
Выполните POST-запрос на него с помощью curl. Убедитесь, что произошел редирект:
# Подставьте ваши параметры # --head – покажет заголовки # -XPOST – отправит POST запрос curl --head -XPOST localhost:8080/users
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.