rudra/container

Rudra framework


Keywords
container, dependency-injection, dependency-injection-container, rudra, ioc-container
License
CNRI-Python-GPL-Compatible

Documentation

Build Status codecov Scrutinizer Code Quality Code Climate Codacy Badge

Code Intelligence Status Latest Stable Version Total Downloads License: GPL-3.0-or-later

Rudra-Container

IoC Контейнер


Иницианализируем контейнер:
use \Rudra\Container as Rudra;
Rudra::app();

Теперь контейнер доступен для вызова 2 способами

Rudra::app();
Rudra::$app;

Добавляем объекты:

Без аргументов - добавит в контейнер класс Annotations с ключом вызова annotation

Rudra::$app->set('annotation', 'Annotations');

С аргументами

Если в конструкторе класс Auth ожидает зависимость Container, то контейнер автоматически создаст необходимый объект и подставит в качестве аргумента

Примечание: класс Container должен быть доступен в автозагрузке Composer

class Auth
{
    public function __construct(Container $container)
    {
        $this->container = $container;
    }
}

Добавление объекта в данном случае аналогично первому

Rudra::$app->set('auth', 'Auth');

Если в конструкторе класс Auth ожидает реализацию инетрфейса IContainer, то для того, чтобы контейнер автоматически создал необходимый объект и подставил в качестве аргумента, нам необходимо связать инетрфейс IContainer с реализацией.

class Auth
{
    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }
}

Добавление объекта в данном случае также аналогично, но в данном случае обязательно связывать интерфейс с реализацией . Для этого воспользуемся методом setBinding, в который мы передадим в качестве первого элемента интерфейс, а в качестве второго реализацию

Rudra::$app->setBinding(ContainerInterface::class, Container::$app);
Rudra::$app->set('auth', 'Auth');

Если конструктор класса содержит аргументы со значениями по умолчанию, то если аргументы не передавать, то значения по умолчанию будут добавлены контейнером

class Auth
{
    public function __construct(ContainerInterface $container, $name, $config = 'something')
    {
        $this->$container = $container;
    }
}

В данном случае можно передать как только аргумент $name, так и $name, $config

Rudra::$app->set('auth', 'Auth', ['name' => 'value']);
Rudra::$app->set('auth', 'Auth', ['name' => 'value', 'config' => 'concrete']);