01 - Класс расширения для компонентов
Есть ряд случаев, когда другой код Joomla хотел бы взаимодействовать с нашим компонентом, например
- маршрутизатор может захотеть использовать пользовательский маршрутизатор нашего компонента для анализа и построения SEF-маршрутов
- если наш компонент поддерживает категории, то
com_categories
захочет отобразить в режиме просмотра категорий сводку по категориям, содержащую количество товаров этой категории с разбивкой по статусу публикации - если наш компонент поддерживает пользовательские поля, то
com_fields
захочет позвонитьgetContexts()
чтобы получить типы элементов, с которыми могут быть связаны пользовательские поля - если наш компонент поддерживает многоязычные ассоциации, то
com_associations
вам захочется узнать типы элементов, с которыми могут быть связаны ассоциации. - и, конечно же, Joomla захочет запустить наш компонент для захвата выходных данных веб-страницы.
Причины введения класса Extension станут понятнее, если мы рассмотрим, как другой код Joomla взаимодействовал с нашим расширением в Joomla 3.
В Joomla 3 все эти другие фрагменты кода были добавлены в кодовую базу нашего компонента довольно бессистемным образом – вызывая функции в различных вспомогательных файлах.
В Joomla 4 это упрощено:
Из Joomla 4 components ознакомьтесь с нашими com_example
компонент, вызвав:
$extension = $app->bootComponent("com_example");
Затем они могут вызвать требуемую функцию в этом экземпляре расширения.
Сразу после создания экземпляра класса расширения компонента код библиотеки Joomla вызовет класс вашего расширения boot
функция, передающая экземпляр вашего дочернего контейнера для внедрения зависимостей:
$extension->boot($container);
Это просто возможность позволить вам делать, ну, на самом деле, все, что вам нравится. Иногда это используется для настройки определенных классов для использования с HtmlHelper::_()
звонки. Или вы можете использовать его для сохранения ссылки на свой дочерний DIC (который в противном случае может быть трудно получить).
После первого создания экземпляра вашего компонента Joomla кэширует экземпляр, и если есть еще один вызов
$extension = $app->bootComponent("com_example");
он просто возвращает ваш экземпляр расширения, вместо того, чтобы снова выполнить экземпляр класса и вызов boot()
. Вы даже можете вызвать bootComponent
, передающий ваш собственный компонент, если вам нужно получить ссылку на ваш собственный объект расширения.