В КУРСЕ?

Разбираемся в теме

Почему адрес страницы не обязан совпадать с именем PHP-файла

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

Маршрут выбирает обработчик запроса

Представим адрес /books для списка и /books/7 для карточки книги. Правило маршрутизации может связать первый путь с обработчиком списка, а второй с обработчиком карточки и параметром 7. Для каждой книги не требуется создавать отдельный PHP-файл с номером в имени. Фреймворки предлагают разные способы описания маршрутов, но основной вопрос один: какой код должен обработать данный запрос? В некоторых правилах учитывают также HTTP-метод и другие условия. Поэтому путь сам по себе не всегда описывает запрос полностью. Для учебной схемы ниже будем рассматривать только запросы GET к перечисленным путям.

Контроллер координирует получение ответа

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

Найденный маршрут и найденная запись различаются

Путь /books/999 может успешно соответствовать правилу карточки, хотя книги с таким номером в данных нет. В этом случае обработчик выбран, но нужный объект не найден. Путь /contact может вообще не соответствовать ни одному правилу приложения. Это другая причина отсутствия страницы. Для пользователя оба случая могут завершаться сообщением о ненайденном ресурсе, но при отладке различие важно. Сначала проверяют, было ли найдено правило и вызван нужный обработчик, затем выясняют результат поиска данных. Такая последовательность не даёт пытаться исправить шаблон, когда ошибка находится ещё на этапе выбора маршрута.

Попробуйте на практике

Проследите обработку запросов по бумажной схеме. Устанавливать PHP, фреймворк или веб-сервер не нужно.

  1. Задайте два правила: GET /books вызывает список, GET /books/{id} вызывает карточку с числовым параметром id. Других маршрутов в условии нет.
  2. Запишите, что каталог содержит только книги с номерами 3 и 7. Рассмотрите запросы /books, /books/7, /books/8 и /contact.
  3. Для каждого запроса сначала определите маршрут и обработчик, затем отдельно отметьте, найден ли необходимый объект. Для списка отдельный номер книги не требуется.
  4. Сравните причины отсутствия результата у /books/8 и /contact. Укажите, на каком этапе следует начинать проверку каждого случая.

Как проверить результат. /books вызывает список, /books/7 карточку существующей книги. /books/8 соответствует маршруту карточки, но запись отсутствует. Для /contact маршрут не задан. Проверка правила и проверка существования данных являются разными шагами; имя физического файла из этих путей не выводится.

Частые вопросы

Обязан ли контроллер сам выполнять все вычисления и запросы к данным?

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

Достаточно ли ограничения id числом, чтобы обеспечить безопасность карточки?

Нет. Проверка формата не устанавливает право пользователя читать объект и не заменяет остальные меры защиты. Формат, существование записи и полномочия проверяются отдельно.

Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.

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

Зарегистрироваться
← К списку материалов