Как разрешается зависимости
Во время build, берется каждая зависимость указанная в entries и пытаются построить полную карту зависимостей любой вложенности.
Построение карты зависимостей осуществляется только на этапе build, в дальнейшем используется уже созданная структура зависимостей.
Разрешение зависимости
Если зависимость указана в params или alias, то она разрешается согласно данной инструкции. В остальных случаях пытаемся сделать autowiring в конструктор.
Autowiring в конструктор.
Механизм с помощью которого анализируется аргументы конструктора класса.
В случае если вы делаете autowiring в несуществующий класс или экземпляр класса нельзя создать (абстрактный класс), то будет выброшено исключение с деталями проблемы.
На основе аргументов конструктора формируются имена зависимостей которые необходимо передавать, чтобы создать экземпляр данного класса.
Если для конкретного аргумента конкретной зависимости указаны конфигурация как создавать эти его создавать с помощью params или alias, то используются эта конфигурация.
Если аргумент имеет значение по умолчанию, то используется значение указанное по умолчанию.
В остальных случаях каждая найденная зависимость разрешается сначала.
Приоритет загрузки зависимостей.
Библиотека предоставляет несколько способов определения зависимостей. Важно понимать, в каком порядке они применяются - это помогает избежать неожиданного поведения и правильно настроить контейнер.
<?php
namespace App;
class Example
{
public function __construct(
public \stdClass $std_class,
) {
}
}
$class1 = new \stdClass();
$class1->id = 1;
$class2 = new \stdClass();
$class2->id = 2;
$class3 = new \stdClass();
$class3->id = 3;
$class4 = new \stdClass();
$class4->id = 4;
(new Cekta\DI\ContainerBuilder(
entries: [Example::class],
params: [
Example::class . '$' . \stdClass::class => $class1,
\stdClass::class => $class3,
'class2' => $class2,
'class4' => $class4,
],
alias: [
Example::class . '$' . \stdClass::class => 'class2',
\stdClass::class => 'class4',
],
))->build();
При запросе Example::class контейнер ищет зависимость в следующем порядке:
| Приоритет | Способ | В нашем примере |
|---|---|---|
| 1 | Локальное имя из params | Example::class . '$' . \stdClass::class резульатат $class1 |
| 2 | Локальное имя из alias | Example::class . '$' . \stdClass::class резульатат $class2 |
| 3 | Глобальное имя из params | \stdClass::class результат $class3 |
| 4 | Глобальное имя из alias | \stdClass::class результат $class4 |
| 5 | Значение по умолчанию | значение по умолчанию не заданно в конструкторе и будет пропущенно |
| 6 | Autowiring в конструктор | Создает \stdClass через Autowiring |