Новый проект на Zend Expressive 3

Zend Expressive - это микрофреймворк, завязанный на использование промежуточного программного обеспечения (middleware).

Что это означает?

Веб-приложение, по сути, получает некий запрос Request от клиента и отдает клиенту некий ответ Response. Обработку запроса и создание ответа делает некоторая основная функция.

Но, перед вызовом этой функции мы можем вызвать некоторые вспомогательные функции, которые могут проанализировать данные запроса или даже изменить их.

Тоже самое можно сделать после вызова основной функции, и вспомогательные функции могут что-то добавить в ответ или даже изменить его полностью.

Эти вспомогательные функции и называют промежуточным программным обеспечением (middleware).

Для нового проекта можно использовать специальную заготовку, доступную через Composer:

composer create-project zendframework/zend-expressive-skeleton ./

или, если не используется глобально установленный Composer:

php composer.phar create-project zendframework/zend-expressive-skeleton ./

Установка делается в пустой каталог, иначе Composer будет ругаться.

Далее, будет запрашиваться, какую архитектуру планируется использовать:

  • можно самому задать, что и где будет распологаться (minimal, устанавливается только конфигурация)
  • можно использовать плоскую архитектуру (flat)
  • можно использовать модульную архитектуру (modular)

Затем, выбираем модули, которые планируется использовать:

  • контейнер для внедрения зависимостей (DI)
  • маршрутизатор (router)
  • шаблонизатор (templates)
  • обработчик ошибок (используется в процессе разработки, в dev-окружении)

В целом, ничего сложного.

Иногда могут возникнуть проблемы с таймаутами при загрузке файлов через Composer, но в России это в основном связано с деятельностью РосКомНадзора, который без разбору блокирует IP-адреса. Обойти это не так просто, но можно: тут пока Google в помощь.

Смотрим, что тут поставилось:

  • файл config.php - это большой PHP-массив, который содержит основные параметры приложения. В процессе загрузки приложения, массив из этого файла объединяется с массивами из
    • файлов чего-то-там.config.php
    • файлов autoload/чего-то-там-global.php
    • файлов autoload/чего-то-там-local.php
    • методов ConfigProvider::__invoke(). Класс ConfigProvider находится в каждом модуле и содержит настройки этого модуля. Это как-раз и есть те самые основные функции.
  • файл routes.php содержит список маршрутов и информацию, какие обработчики используются для каждого из описанных маршрутов.
  • в файле pipeline.php задается перечень и порядок запуска промежуточного ПО. Часть из заданных здесь классов может прервать выполнение программы и выдать свой ответ клиенту, а другая часть - только передать данные по стеку вызовов дальше. Преимущественно, весь этот перечень классов используется при каждом запросе, но некоторые можно привязать к определенным маршрутам.
  • в файле container.php достается из объединенной конфигурации информация о классах, которые нужно использовать к качестве сервисов и создается контейнер, в котором эти сервисы будут доступны.

Выполнение приложения начинается с файла public/index.php: там происходит вызов анонимной функции (внутри этой функции создается DI-контейнер, экземпляр приложения, промежуточное ПО и происходит обработка маршрута). Результатом будет некий ответ клиенту.

В каталоге src/App создается пример модуля. Чтобы приложение могло использовать код этого модуля

  1. в файле composer.json прописывается пространство имен модуля
  2. в массив файла config.php добавляется полное имя класса ConfigProvider модуля App
  3. Profit, вроде :)

Полезные ссылки:

  1. Официальная документация (en)
  2. Использование Zend Framework 3 (ru)
Евгений Вдовенко
Евгений Вдовенко

Физик по образованию, занимаюсь веб-разработкой на PHP с 2013 года. Нравится ковырятся в Zend Framework/Expressive и Joomla CMS/Framework. В процессе разборок с Python. Подумываю посмотреть Go. Считаю PostgreSQL крутым продуктом и внедряю его везде, где могу.