06 - Модули и плагины
Файлы поставщика услуг для модулей и плагинов значительно проще, чем файлы для компонентов. Если вы просмотрите свои папки модулей и плагинов экземпляра Joomla, вы найдете несколько примеров services/provider.php файлов.
Модули
Например, для mod_breadcrumbs в Joomla 5 у нас есть:
use Joomla\CMS\Extension\Service\Provider\Module;
public function register(Container $container): void
{
$container->registerServiceProvider(new ModuleDispatcherFactory('\\Joomla\\Module\\Breadcrumbs'));
$container->registerServiceProvider(new HelperFactory('\\Joomla\\Module\\Breadcrumbs\\Site\\Helper'));
$container->registerServiceProvider(new Module());
}
Этот модуль использует стандартный класс Joomla\CMS\Extension\Service\Provider\Module для создания своего класса расширения \Joomla\CMS\Extension\Module.
Он имеет 2 зависимости:
- Он использует класс ModuleDispatcherFactory для создания своего собственного экземпляра Dispatcher.php в src/Dispatcher/Dispatcher.php
- Он использует HelperFactory для поиска своего вспомогательного файла в src/Helper/BreadcrumbsHelper.php
Плагины
Например, для плагина custom field color в разделе plugins/fields/color
use Joomla\Plugin\Fields\Color\Extension\Color;
public function register(Container $container)
{
$container->set(
PluginInterface::class,
function (Container $container) {
$plugin = new Color(
$container->get(DispatcherInterface::class),
(array) PluginHelper::getPlugin('fields', 'color')
);
$plugin->setApplication(Factory::getApplication());
return $plugin;
}
);
}
Класс расширения плагина - Color, который создается с двумя параметрами, передаваемыми в его конструктор:
- класс EventDispatcher – получен из родительского DIC, изначально был введен в него из libraries/src/Service/Provider/Dispatcher.php при инициализации Joomla
- объект stdClass плагина, который Joomla традиционно использовала для хранения данных плагина (id, name, type и параметров).
Это стандартный шаблон, который вы можете использовать для своих собственных плагинов. Очевидно, что вы можете получить экземпляр приложения, вызвав Factory::getApplication либо в файле services/provider.php, либо в вашем стандартном коде плагина.