Использование MVC-фабрики в плагинах Joomla 5
Обычно, концепция Model‑View‑Controller используется в компонентах Joomla, но я хочу поделиться опытом её применения в плагинах.
Для чего это надо? — Сделать код более простым и понятным.
Задача плагина Joomla — подписываться на события и выполнять определенные действия. Но не стоит размещать весь код в классе плагина, лучше разделить его на несколько классов. Особенно, если для ваших задач Joomla предлагает готовые родительские классы.
Почему я предлагаю использовать MVC-фабрику? - Она не только создаёт экземплр класса, но и устанавливает основные зависимости из DI контейнера.
Например, плагин должен ответить на AJAX-запрос и вернуть массив данных. Для этого надо написать свой класс модели, наследующий Joomla\CMS\MVC\Model\ListModel.
Как это сделать? - Примерно так же как и в компонентах.
Классу плагина подключаем трейт Joomla\CMS\MVC\Factory\MVCFactoryAwareTrait.
В файле provider.php плагина регистрируем сервис-провайдер MVC-фабрики и передаём ему пространство имён плагина.
$container->registerServiceProvider(new MVCFactory('Joomla\\Plugin\\RadicalMart\\WishboxCdek'));Устанавливаем плагину экземпляр фабрики, полученный из контенера.
$plugin->setMVCFactory($container->get(MVCFactoryInterface::class));В src папке плагина, создаём папку Administrator, в ней папку Model и в ней файл с классом модели. То есть классы моделей будут расположены по пути Root\plugins\radicalmart\wishboxcdek\src\Administrator\Model.
Обратите вн��мание на папку Administrator, метод создания моделей обязательно требует либо Site либо Administrator в namespace.
namespace Joomla\Plugin\RadicalMart\WishboxCdek\Administrator\Model;Ещё в класс модели надо установить свойство option:
protected $option = 'com_radicalmart';Теперь мы можем получать экземпляр модели плагина Orders , следующим образом:
/** @var OrdersModel $ordersModel */
$ordersModel = $app->bootPlugin('wishboxcdek', 'radicalmart')
->getMVCFactory()
->createModel('Orders', 'Administrator');В своём плагине я наследовал класс модели от BaseDatabaseModel, для работы с другими классами может потребоваться переопределение каких-либо свойств и методов.
