> плюс это не отвечает на вопрос:
А там, собственно, два варианта.
1. Если зависимость не обязательная, то "нет диспетчера — нет к нему обращения".
2. Если зависимость обязательная, то она передаётся в конструктор фабрики, а фабрика уже собирает виджет со всеми зависимостями. Просто базовые зависимости передаются через сеттер. В случае, если виджет не получит диспетчер, то при обращении к нему вывалится исключение.
Уже большинством мнений решили, что диспетчер событий обязателен, даже если твоему виджету он не нужен. Поэтому вариант 1 отпадает. Это решение ведёт к другой проблеме, но сейчас не об этом.
Вообще суть голосования в том, что вроде бы правильно обязательную зависимость засовывать в конструктор, но тогда эти зависимости придётся тащить через все конструкторы наследников. Это не очень удобно, поскольку класс Widget является базовым.
Однако, в случае виджетов есть один нюанс: объекты виджетов в пользовательском коде собираются через фабрику. Не через конструктор. Это даёт возможность использовать особые правила сборки: можно передавать любые зависимости (обязательные и опциональные) через сеттеры, а не через конструктор. А почему бы и нет? У нас сразу появляется отличная возможность очистить конструкторы наследников, даже не надо будет вызывать в них конструктор родителя.
Давайте рассмотрим варинты сабжа:
Код твоего виджета
если зависимости базового класса передаются через конструктор:
Код: Выделить всё
class MyWidget extends Widget
{
private MyDependency $myDependency;
public function __construct(MyDependency $myDependency, EventDispatcherInterface $eventDispatcher)
{
$this->myDependency = $myDependency;
parent::__construct($eventDispatcher);
}
}
если зависимости базового класса передаются через сеттер:
Код: Выделить всё
class MyWidget extends Widget
{
private MyDependency $myDependency;
public function __construct(MyDependency $myDependency)
{
$this->myDependency = $myDependency;
}
}
Как ты будешь это использовать во вьюшке
если зависимости базового класса передаются через конструктор:
Код: Выделить всё
MyWidget::begin($options);
MyWidget::widget($options);
MyWidget::end();
если зависимости базового класса передаются через сеттер:
Код: Выделить всё
MyWidget::begin($options);
MyWidget::widget($options);
MyWidget::end();
(одинаково, ведь begin() и widget() обращаются к фабрике виджетов)
Как ты будешь создавать виджет в обход фабрики
Не стоит этого делать, парень
Мнения в пользу конструктора вы можете посмотреть на англоязычном форуме
https://forum.yiiframework.com/t/widget ... ure/128434
Итого
Один фиг уже смержили вариант с зависимостью в конструкторе. Теперь при написании виджетов придётся в наследниках описывать зависимости конструктора родителей.