Containers (Контейнеры)
По умолчанию: []
Что такое Containers?
Это список зависимостей, которые будут доступны через методы контейнера:
get()- получение зависимостиhas()- проверка наличия (возвращаетtrueтолько для зависимостей из этого списка)
Какие зависимости указывать
В список включайте основные точки входа вашего приложения:
- HTTP-обработчики
- Контроллеры
- Middleware
- Консольные команды
- Другие основные сервисы
Как это работает
На этапе компиляции библиотека:
- Анализирует все зависимости из списка
- Пытается создать их автоматически
- Рекурсивно разрешает все вложенные зависимости
Если какая-то зависимость не может быть разрешена - вы получите ошибку на этапе генерации.
🔧 Autowiring в конструкторе
Autowiring - это автоматическое внедрение зависимостей на основе аргументов конструктора.
Как это работает:
- Библиотека анализирует каждый аргумент конструктора
- Для определения имени зависимости:
- Если у аргумента указан тип (type-hint) и это не встроенный тип (
string,intи т.д.) - используется имя типа - Иначе используется имя аргумента (без
$)
- Если у аргумента указан тип (type-hint) и это не встроенный тип (
- Процесс повторяется рекурсивно для всех найденных зависимостей
Особенности:
- Глубина вложенности не ограничена
- Autowiring применяется только к зависимостям без специальной конфигурации в
paramsилиalias
📋 Пример autowiring
Структура классов:
<?php
declare(strict_types=1);
namespace App;
class Example
{
public function __construct(
private A $a,
private B $b,
) {
}
}
class B
{
public function __construct(private C $c)
{
}
}
class A
{
}
class C
{
}
Конфигурация:
new \Cekta\DI\Compiler(
containers: [\App\Example::class],
// params и alias не указаны - работает autowiring
)->compile();
Результат:
- Создаётся
Example, которому автоматически передаютсяAиB - Для создания
Bавтоматически создаётсяC - Все зависимости разрешены без дополнительной конфигурации
💡 Важно
- Только то, что в списке
Методhas()вернётtrueтолько для зависимостей изcontainers. - Проверка на этапе компиляции Все ошибки (недоступные зависимости, циклические ссылки) обнаруживаются до запуска приложения.
- Комбинируйте с другими методами
Autowiring можно комбинировать с явной конфигурацией через params и alias. - Начинайте с простого
Добавляйте зависимости в список постепенно, проверяя работу на каждом этапе.