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 , передающий ваш собственный компонент, если вам нужно получить ссылку на ваш собственный объект расширения.
