Зарегистрируйтесь, чтобы продолжить обучение

Обработчики запросов Веб-разработка на PHP

Главная содержательная часть в файле index.php — обработчик запроса:

<?php

$app = AppFactory::create();

// Обработчик
$app->get('/', function ($request, $response) {
    return $response->write('Welcome to Slim!');
});

Общий принцип работы любого веб-фреймворка отражает архитектуру HTTP. На каждый адрес задается обработчик (функция, handler), который выполняет необходимые действия и возвращает ответ.

В Slim все приложение представлено объектом класса Slim\App. Этот объект содержит методы на каждый глагол HTTP: get, post, put и так далее. Эти методы принимают на вход два параметра:

  • Адрес или маршрут, для которого вызовется обработчик
  • Обработчик. Лямбда-функция с двумя параметрами $request и $response

Во фреймворках принято определять маршрут как комбинацию метода HTTP и адреса. Это соответствует идеям REST. То есть GET /users и POST /users с точки зрения большинства фреймворков — разные маршруты со своими обработчиками. В этом достаточно просто убедиться, если определить соответствующие маршруты и выполнить к ним запросы с помощью curl:

<?php

$app = AppFactory::create();

$app->get('/users', function ($request, $response) {
    return $response->write('GET /users');
});

$app->post('/users', function ($request, $response) {
    return $response->write('POST /users');
});

$app->run();
curl localhost:8080/users

GET /users
curl -XPOST localhost:8080/users

POST /users

Перед тем как двигаться дальше, обязательно попробуйте повторить примеры выше в вашей локальной среде. Это важно для понимания дальнейшего контента.

Первое, что бросается в глаза, — у нас всего один входной файл для всех адресов. Пользователь может запрашивать сколь угодно сложный адрес /companies/3/photos5. Всё сведется к запуску файла index.php, а сам адрес становится лишь значением $_SERVER['REQUEST_URI']:

.
├── site
│   └── public
│       └── index.php

Такой подход имеет название FrontController в противовес подходу, когда каждый адрес фактически отображался на конкретный файл файловой системы — PageController.

В интернете до сих пор встречаются сайты, построенные по этой модели, но она давно вышла из употребления. Заметить ее легко. Если есть адреса наподобие /users.php, то почти наверняка в корне сайта лежит файл users.php, который отвечает за обработку этой страницы:

.
├── site
│   └── public
│       └── home.php
│       └── users.php
│       └── companies.php

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

До входа во фреймворк:

  1. Клиент выполняет запрос к веб-серверу, расположенному на сервере. Клиент — это не обязательно браузер, в примере выше клиентом выступает программа curl
  2. Веб-сервер перенаправляет запрос на index.php и устанавливает правильные параметры запроса

После входа в сам PHP (именно это и есть диспетчеризация):

  1. Фреймворк анализирует параметры запроса и пытается сопоставить маршруты, добавленные в объект $app (как в примерах в начале урока) с тем, что пришло. Он сравнивает комбинацию метода запроса и сам адрес. Этот процесс называется роутингом или маршрутизацией. А место, где внутри хранятся все добавленные маршруты, называют роутером
  2. Если в процессе роутинга был найден соответствующий маршрут, то вызывается его обработчик
  3. Ответ, сформированный обработчиком, отправляется обратно клиенту

Рассмотрим конкретный пример. Возьмем за основу следующий код:

<?php

$app = AppFactory::create();

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

$app->get('/companies', function ($request, $response) {
    return $response->write('GET /companies');
});

$app->post('/companies', function ($request, $response) {
    return $response->write('POST /companies');
});

$app->run();

После запуска этого кода формируется роутер, который содержит в себе три маршрута:

GET /
GET /companies
POST /companies

Теперь предположим, что клиент выполнил такой запрос:

curl -XPOST localhost:8080/companies

Веб-сервер запустил index.php, который проинициализировал объект $app. Затем фреймворк сопоставил маршруты и нашел, что за этот запрос отвечает POST /companies. Далее фреймворк вызвал обработчик, который вернул клиенту ответ: POST /companies.

Если фреймворк не обнаружит соответствия, например, клиент запросит страницу /comments, то он возьмет управление на себя по умолчанию и автоматически отдаст браузеру ответ 404. Так он говорит о том, что страница не найдена.

Всегда нужно внимательно смотреть, какие делаются запросы и есть ли подходящие под них ответы, чтобы не думать о том, почему браузер ничего не показывает. Проще всего увидеть ответ от сервера через консоль разработчика браузера:

DevTool Network

Она есть в каждом браузере. Попробуйте открыть ее и понаблюдать за процессом загрузки.


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

  1. Добавьте обработчик в файл index.php, который мы создали в самостоятельной работе предыдущего урока:

<?php

$app->get('/users', function ($request, $response) {
    return $response->write('GET /users');
});
  1. Откройте в браузере эту страницу. Убедитесь, что на экран вывелся текст, переданный в метод write():

Slim GET handler

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

  1. Front Controller

Аватары экспертов Хекслета

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

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

Для полного доступа к курсу нужен базовый план

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

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

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

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

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

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
Программирование на PHP, Разработка веб-приложений и сервисов используя Laravel, проектирование и реализация REST API
10 месяцев
с нуля
Старт 26 декабря

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

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

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»