Re: Конструктор виджетов
Добавлено: 2020.01.24, 15:54
roxblnfk, ясно, спасибо за подробный ответ.
Я думаю было бы логично, если бы фабрика в методе create использовала бы композитный контейнер из контейнера полученного через конструктор и самой фабрики(как контейнера), естественно с приоритетом фабрики(как контейнера) (не помню что там за чем для этого добавлять в композитном контейнере). Тогда при создании фабрики мы можем установить/переопределить локальные зависимости для объектов, создаваемых этой фабрикой, не изменяя при этом глобальный/внедренный контейнер, но его зависимости по-прежнему будут доступны. По факту композитный контейнер должен создаваться в конструкторе фабрики и записываться в $this->container.
Код: Выделить всё
private function resolveDependencies(ContainerInterface $container, array $dependencies): array
{
$container = $container->container ?? $container;
//...
}
Код: Выделить всё
$provider = new \Yiisoft\EventDispatcher\Provider\Provider();
$dispatcher = new \Yiisoft\EventDispatcher\Dispatcher($provider);
WidgetFactory::initialize(null, [
EventDispatcherInterface::class => $dispatcher
]);
Код: Выделить всё
public function __construct(ContainerInterface $container = null, array $definitions = [])
{
$compositeContainer = new CompositeContainer();
$compositeContainer->attach($container);
$compositeContainer->attach($this);
$this->container = $compositeContainer;
$this->setMultiple($definitions);
}
public function create($config, array $params = [])
{
return Normalizer::normalize($config)->resolve($this->container, $params);
}
public function get($id, array $params = [])
{
return $this->getDefinition($id)->resolve($this->container, $params);
}
Код: Выделить всё
$container = $container->container ?? $container;
Код: Выделить всё
public function attach(?ContainerInterface $container): void
{
if (isset($container)) {
array_unshift($this->containers, $container);
}
}