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']);