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

Containers (Контейнеры)

По умолчанию: []

Что такое Containers?

Это список зависимостей, которые будут доступны через методы контейнера:

  • get() - получение зависимости
  • has() - проверка наличия (возвращает true только для зависимостей из этого списка)

Какие зависимости указывать

В список включайте основные точки входа вашего приложения:

  • HTTP-обработчики
  • Контроллеры
  • Middleware
  • Консольные команды
  • Другие основные сервисы

Как это работает

На этапе компиляции библиотека:

  1. Анализирует все зависимости из списка
  2. Пытается создать их автоматически
  3. Рекурсивно разрешает все вложенные зависимости

Если какая-то зависимость не может быть разрешена - вы получите ошибку на этапе генерации.

🔧 Autowiring в конструкторе

Autowiring - это автоматическое внедрение зависимостей на основе аргументов конструктора.

Как это работает:

  1. Библиотека анализирует каждый аргумент конструктора
  2. Для определения имени зависимости:
    • Если у аргумента указан тип (type-hint) и это не встроенный тип (string, int и т.д.) - используется имя типа
    • Иначе используется имя аргумента (без $)
  3. Процесс повторяется рекурсивно для всех найденных зависимостей

Особенности:

  • Глубина вложенности не ограничена
  • Autowiring применяется только к зависимостям без специальной конфигурации в params или alias

📋 Пример autowiring

Демонстрация на GitHub

Структура классов:

<?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
  • Все зависимости разрешены без дополнительной конфигурации

💡 Важно

  1. Только то, что в списке
    Метод has() вернёт true только для зависимостей из containers.
  2. Проверка на этапе компиляции Все ошибки (недоступные зависимости, циклические ссылки) обнаруживаются до запуска приложения.
  3. Комбинируйте с другими методами
    Autowiring можно комбинировать с явной конфигурацией через params и alias.
  4. Начинайте с простого
    Добавляйте зависимости в список постепенно, проверяя работу на каждом этапе.