Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос нашим менторам. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

HTTP Сессия (запрос и ответ)

Каждая 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, который никак не используется, а наружу возвращается старый. Если попробовать выполнить запрос к этому обработчику, то он не вернет никаких данных.

Параметры запроса

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

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

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

  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

<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят менторы из команды Хекслета или другие студенты.

Для полного доступа к курсу нужна профессиональная подписка

Профессиональная подписка откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, даст возможность обращаться за помощью к менторам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
115
курсов
892
упражнения
2241
час теории
3196
тестов

Зарегистрироваться

или войти в аккаунт

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг».

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг».