Доброго времени суток.
Задача: сделать каталоги фильмов, игр и знаменитостей на Yii2, все они имеют много общего (вывод списка, детальный вывод, фильтрация...).
Решение: написать базовый модуль Catalog и на его основе сделать модули Films, Games, Stars...
Для удобства опустим подробности реализации. Этот модуль реализует базовый функционал, который легко настроить и доработать с помощью переопределения.
Как вы решаете такие проблемы? Не писать же каждый раз одно и тоже. Например битрикс сделал инфоблоки, достаточно удобное и гибкое решение
Пример решения/** Описание интерфейса базового модуля Каталог */
abstract class CatalogInterface
{
/** @var bool Отображать фильтр */
public $filter = false;
abstract getModel();
public function getListWidget()
{
return CatalogListWidget::classname();
}
public function getDetailWidget()
{
return CatalogDetailWidget::classname();
}
public function getFilterWidget()
{
return CatalogFilterWidget::classname();
}
}
/** Базовый контроллер каталога */
abstract class CatalogController extends Controller
{
/** @var CatalogInterface Класс описывающий интерфейс модуля */
protected $interface = null;
public function init()
{
$this->interface = Module::getInterface('catalog');
}
public function listAction()
{
if ($this->interface->filter)
{
$filterWidget = $this->interface->getFilterWidget();
$filterWidget::widget();
}
$listWidget = $this->interface->getListWidget();
$listWidget::widget();
}
public function detailsAction()
{
$detailsWidget = $this->interface->getDetailsWidget();
$detailsWidget::widget();
}
}
/** Конфигурация каталога в модуле Фильмы */
class FilmsCatalogInterface extends CatalogInterface
{
/** @var bool Отображать фильтр */
public $filter = true;
}
/** Контроллер каталога в модуле Фильмы */
class FilmsController extends CatalogController
{
public function getModel()
{
return Film::classname();
}
}
Базовый модуль содержит базовый набор виджетов, готовые контроллеры и класс, в котором хранится конфигурация и неймспейсы используемых классов.
В итоге у нас есть возможность добавления и переопределения экшенов, замены и кастомизации виджетов.
Например мы можем на основе этого модуля создать модуль фильмов.
1. Опишем интерфейс как того требует модуль Каталог в классе FilmsCatalogInterface
2. Унаследуем контроллеры модуля Каталог
Всё, готово. Если нужно будет изменить детальный вывод фильма, мы можем переопределить виджет детального вывода, можно заменить шаблон или доработать его логику. В общем можно добавить больше возможностей для конфигурации и переопределения, это даст возможность изменить любой шаблон, контроллер и виджет.
На самом деле цель создать универсальное решение, которое позволило бы просто добавлять на сайт типичные разделы типа каталог фильмов, игр, книг, музыки с возможностью гибкой фильтрации... В целом они должны быть похожи, но при этом должна быть возможность создания других разделов, например каталог youtube-каналов.
В общем что-то на подобии инфоблоков битрикс и его компонентов