Project
Это основная информация о вашем проекте, его основная задача получить объект реализующий
Psr\Container\ContainerInterface с помощью которого дальше разрешаются все зависимости.
Параметры для создания
- modules - массив объектов реализующих
\Cekta\Framework\Contract\Module - container_filename - полный путь до файла где будет осуществляться build класса Container.
- container_fqcn - FQCN класса Container, следуйте psr4, он должен иметь автозагрузку via composer.
- discover_filename - имя файла где будет храниться кэш discovery.
- class_loader - callback функция предоставляющая список всех классов проекта.
Project предоставляет модулям общий жизненный цикл, а также необходимую информацию (список всех классов проекта),
чтобы модули сформировали необходимую конфигурацию для создания объекта реализующего ContainerInterface.
Жизненный цикл
- Discovery - исследование всех reflection классов проекта.
- Build - генерация файла класса реализующего
ContainerInterface. - 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 хранится основная настройка приложения и инициализация всех модулей.
Мы получаем единое место настройки приложения, а также подключения и управления всеми модулями.
Некоторые модули могут иметь обязательные и опциональные параметры, которые мы можем конфигурировать в одном месте.