Использование 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
, для работы с другими классами может потребоваться переопределение каких-либо свойств и методов.