Encodera

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

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

Оглавление

Запрос

Всё, что прислал браузер, — адрес, параметры, данные формы, заголовки — Slim собирает в один объект запроса. Обработчик получает его первым аргументом, $request. Объект устроен по стандарту PSR-7 — общему для PHP описанию запроса и ответа, поэтому те же методы встречаются и в других фреймворках.

Суперглобальные массивы $_GET и $_POST в Slim не используют: все данные читают из $request.

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

Параметры после знака вопроса возвращает метод getQueryParams():

// public/index.php
$app->get('/search', function (Request $request, Response $response) {
    $params = $request->getQueryParams();
 
    $query = $params['q'] ?? '';
 
    $response->getBody()->write('Ищем: ' . htmlspecialchars($query));
 
    return $response;
});

Откройте http://localhost:8080/search?q=slim — на странице будет «Ищем: slim». Метод возвращает обычный массив; если параметра нет, срабатывает значение после ??. Функция htmlspecialchars() обезвреживает HTML в чужом тексте.

Данные формы и JSON

Тело запроса — данные формы или JSON — возвращает getParsedBody(). Чтобы Slim разбирал и JSON, в public/index.php после создания приложения добавьте одну строку:

// public/index.php
$app = AppFactory::create();
$app->addBodyParsingMiddleware();

Теперь данные читаются одинаково в обоих случаях:

// public/index.php
$app->post('/posts', function (Request $request, Response $response) {
    $data = (array) $request->getParsedBody();
 
    $title = trim($data['title'] ?? '');
 
    $response->getBody()->write('Создана статья: ' . htmlspecialchars($title));
 
    return $response;
});

Проверка из терминала:

curl -X POST -d "title=Первая статья" http://localhost:8080/posts

В ответ придёт «Создана статья: Первая статья». Приведение (array) нужно потому, что при пустом теле метод возвращает null.

Заголовки

Заголовок — служебная строка запроса вида «имя: значение». Его читает getHeaderLine():

$agent = $request->getHeaderLine('User-Agent');

Если заголовка нет, вернётся пустая строка. Регистр букв в имени не важен.

Что ещё есть в запросе

МетодЧто возвращает
getMethod()Метод HTTP: GET, POST
getUri()->getPath()Путь адреса: /posts/5
hasHeader('Authorization')Есть ли заголовок
getCookieParams()Массив cookie
getServerParams()Данные сервера, например REMOTE_ADDR
getUploadedFiles()Загруженные файлы
getAttribute('user')Атрибут запроса

Атрибуты

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

$user = $request->getAttribute('user');

Если атрибута нет, вернётся null. Как посредник добавляет атрибут, показано в уроке о посредниках.

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

getParsedBody() возвращает null для JSON, если забыть $app->addBodyParsingMiddleware() или если клиент не прислал заголовок Content-Type: application/json. Данные обычной формы PHP разбирает сам, поэтому ошибка проявляется только на JSON-запросах — и её долго ищут.

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

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