Не давно расширяя codeigniter с адаптацией под YII (текущий проект должен быть переписан под YII, но пока работа идёт на CI), сделал разделение на виджеты.
Метод запускающий виджет является "Шаблонным методом" и как правило в нём можно применить принцип проектирования "Не вызывайте нас - мы вас сами вызовем".
В каждом более-менее среднем проекте существует масса динамичных бизнес правил, которые регламентируют показ той или иной повторяющейся части страницы/функциональности, то есть виджета.
Соответственно выше принцип можно применить и здесь в виде, так называемых "перехватчиков", в которых возможны регламентации бизнес/логическими правилами для отображения виджета.
Вот "шаблонный метод" виджета (YII2):
Код: Выделить всё
/**
* Creates a widget instance and runs it.
* The widget rendering result is returned by this method.
* @param array $config name-value pairs that will be used to initialize the object properties
* @return string the rendering result of the widget.
*/
public static function widget($config = [])
{
ob_start();
ob_implicit_flush(false);
/** @var Widget $widget */
$config['class'] = get_called_class();
$widget = Yii::createObject($config);
$widget->run();
return ob_get_clean();
}
Код: Выделить всё
class Widget extends Component implements ViewContextInterface
{
/*
* Флаг позволяет определить правило отображения клиентом
*/
public $isShow = null;
/**
* Creates a widget instance and runs it.
* The widget rendering result is returned by this method.
* @param array $config name-value pairs that will be used to initialize the object properties
* @return string the rendering result of the widget.
*/
public static function widget($config = [])
{
// По иерархии приоритетности правила определения "клиентом" выше самого виджета
if ($this->isShow === true || ($this->isShow === null && $this->isShow() === true)) {
ob_start();
ob_implicit_flush(false);
/** @var Widget $widget */
$config['class'] = get_called_class();
$widget = Yii::createObject($config);
$widget->run();
return ob_get_clean();
}
else {
return '';
}
}
/*
* Перехватчик позволяет задать правило отбражения виджетом
* @return bool
*/
public function isShow(){ return true; }
Так как виджет и шаблон являются представлениями тем самым не нарушаем, если правила отображения вносим на этом уровне. Сами определения правил можно просто делегировать другим классам (бизнес-логики).
Прошу не судить строго, я из своего опыта
Спасибо за отклики.
Извиняюсь если не в ту ветку, может это коснётся всех версий?