Каждая HTTP сессия определяется двумя вещами - запросом и ответом. Запрос формируется клиентом, ответ кодом обработчика соответствующего маршрута. И запрос и ответ, в Slim представлены двумя объектами, которые передаются в каждый обработчик.

<?php

$app->get('/', function ($request, $response) {
    return $response->write('Hello, world!');
});

$response по стандарту - неизменяемый, это значит, что каждый метод, который выглядит как мутирующий (изменяющий) $response, на самом деле, возвращает новый $response. Не зная этого, очень легко допустить такую ошибку:

<?php

$app->post('/users', function ($request, $response) {
    // Метод withStatus устанавливает код ответа HTTP
    $response->withStatus(302);
    return $response;
});

В этом коде withStatus возвращает новый $response, который никак не используется, а наружу возвращается старый. Если попробовать выполнить запрос к этому обработчику, то он не вернет никаких данных.

Query Params не являются частью маршрута и не влияют на выбор обработчика. Связано это с тем, что такие параметры используются для различных вспомогательных целей, например, параметр 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;
});

Количество обработчиков и маршрутов которые можно добавить ничем не ограничено. При этом микрофреймворки не задают никакой структуры. Если кода становится много, то разделять код по файлам придется самостоятельно.

Во фреймворках не подразумевается прямая работа с PHP в режиме CGI. Данные запроса берутся из объекта $request, ответ вместе с заголовками записывается в объект в $response. Конкретно для отправки тела вызывается функция write. Ее можно использовать множество раз в рамках одного обработчика. Подробнее об этих объектах мы поговорим в следующих уроках.

Самостоятельная работа

  1. Добавьте в index.php следующий обработчик:

    <?php
    
    $app->post('/users', function ($request, $response) {
        return $response->withStatus(302);
    });
    
  2. Выполните POST запрос на него используя curl. Убедитесь что произошел редирект:

    # Подставьте ваши параметры
    # --head – покажет заголовки
    # -XPOST – отправит POST запрос
    $ curl --head -XPOST localhost:8080/users
    

Дополнительные материалы

  1. Request
  2. Response
Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →