Есть ряд случаев, когда другой код Joomla хотел бы взаимодействовать с нашим компонентом, например

  • маршрутизатор может захотеть использовать пользовательский маршрутизатор нашего компонента для анализа и построения SEF-маршрутов
  • если наш компонент поддерживает категории, то com_categories захочет отобразить в режиме просмотра категорий сводку по категориям, содержащую количество товаров этой категории с разбивкой по статусу публикации
  • если наш компонент поддерживает пользовательские поля, то com_fields захочет позвонить getContexts() чтобы получить типы элементов, с которыми могут быть связаны пользовательские поля
  • если наш компонент поддерживает многоязычные ассоциации, то com_associations вам захочется узнать типы элементов, с которыми могут быть связаны ассоциации.
  • и, конечно же, Joomla захочет запустить наш компонент для захвата выходных данных веб-страницы.

Причины введения класса Extension станут понятнее, если мы рассмотрим, как другой код Joomla взаимодействовал с нашим расширением в Joomla 3.

Доступ к компонентам Joomla 3

В Joomla 3 все эти другие фрагменты кода были добавлены в кодовую базу нашего компонента довольно бессистемным образом – вызывая функции в различных вспомогательных файлах.

В Joomla 4 это упрощено:

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