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

Как разрешается зависимости

Во время 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Локальное имя из paramsExample::class . '$' . \stdClass::class резульатат $class1
2Локальное имя из aliasExample::class . '$' . \stdClass::class резульатат $class2
3Глобальное имя из params\stdClass::class результат $class3
4Глобальное имя из alias\stdClass::class результат $class4
5Значение по умолчаниюзначение по умолчанию не заданно в конструкторе и будет пропущенно
6Autowiring в конструкторСоздает \stdClass через Autowiring