Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Project

Это основная информация о вашем проекте, его основная задача получить объект реализующий Psr\Container\ContainerInterface с помощью которого дальше разрешаются все зависимости.

Параметры для создания

  1. modules - массив объектов реализующих \Cekta\Framework\Contract\Module
  2. container_filename - полный путь до файла где будет осуществляться build класса Container.
  3. container_fqcn - FQCN класса Container, следуйте psr4, он должен иметь автозагрузку via composer.
  4. discover_filename - имя файла где будет храниться кэш discovery.
  5. class_loader - callback функция предоставляющая список всех классов проекта.

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

Жизненный цикл

  1. Discovery - исследование всех reflection классов проекта.
  2. Build - генерация файла класса реализующего ContainerInterface.
  3. Create - создание экземпляра класса реализующего ContainerInterface и передача ему необходимы параметров.

Discovery

Это процесс когда каждый модуль получает экземпляр ReflectionClass всех объектов проекта, каждый модуль может их проанализировать discover(ReflectionClass $class): void и использовать эту информацию на следующих этапах.

Можно посмотреть все классы которые реализуют interface, или имеют php attribute (GET, POST и тд).

После выполнения discovery каждый модуль опрашивается getCacheableData(): mixed каждый модуль может сохранить любую информацию для себя, эта информация запишется в файлик (cache), требуется чтобы данные можно было преобразовать в json с помощью json_encode.

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

Модули могут игнорировать этап discovery, ничего не анализируя и возвращать пустой массив, реализация этого этапа опциональна для модулей.

Build

После осуществления discovery необходимо сгенерировать файл класса реализующий ContainerInterface.

Для этого опрашивается каждый модуль onBuildDefinitions($cachedData) передается информация с этапа discovery, этот метод должен вернуть набор параметров entries, alias, factories, singletons которые используются при генерации класса с помощью cekta/di.

Во время этапа build также вызывается onCreateParameters(mixed $cachedData): array которая возвращает params имена параметров используются во время build, чтобы получить обязательные параметры, которые необходимо передавать на этапе create. Значения параметров будут браться на этапе Create.

Подробней о entries, params, alias, factories, singletons в документации cekta/di.

Этап build вызывается единожды, в последующем имеется сгенерированный файл класса runtime/AppContainer.php с результатом выполнения данного этапа.

Create

На этом этапе создается экземпляр класса реализующего ContainerInterface, для создания объекта нужно передать значения параметров.

Project у каждого модуля вызываете onCreateParameters(mixed $cachedData): array для получения params, значение которых используются для внедрения в зависимости.

Этот этап вызывается каждый раз (при обработке http запроса или выполнения cli команды), onCreateParameters(mixed $cachedData): array оптимизировано с точки зрения производительности.

Project в SKELETON

Project в SKELETON расширяет базовую реализацию Project.

Параметры для создания

env - параметры окружения, актуальные настройки сервера и тд.

Внутри project в skeleton хранится основная настройка приложения и инициализация всех модулей.

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