Класс расширения (Extension) для компонентов Joomla 5
Перевод с английского: Joomla! Programmers Documentation for Joomla 5.2
В ряде случаев Joomla может взаимодействовать с нашим компонентом. Например:
Роутер Joomla может использовать роутер нашего компонента для анализа и создания ЧПУ-адресов;
Если наш компонент поддерживает категории, то
com_categories
будет отображать в представлении категорий сводку по каждой категории, содержащую количество материалов с этой категорией, с разбивкой по статусу публикации;Если наш компонент поддерживает пользовательские поля, то
com_fields
будет вызывать методgetContexts()
, чтобы получить типы материалов, к которым можно привязать пользовательские поля;Если наш компонент поддерживает мультиязычные связи, то
com_associations
потребуется знать типы материалов, для которых возможны связи;И, конечно же, Joomla потребуется запустить наш компонент, чтобы получить вывод.
Причины введения класса расширения становятся понятнее, если рассмотреть, как другие части кода Joomla взаимодействовали с нашим расширением в Joomla 3.
В Joomla 3 все эти части кода обращались к кодовой базе нашего компонента довольно хаотичным образом — вызывая функции из различных вспомогательных файлов.
А в Joomla 4 это упрощено:

Начиная с Joomla 4, другие компоненты получают доступ к нашему компоненту com_example
, вызывая метод:
$extension = $app->bootComponent("com_example");
Затем они могут вызывать необходимые им методы через этот экземпляр класса расширения.
Справка:
Класс расширения (Extension) компонента вы можете найти в административной части компонента. Например, для компонента
com_content
это файлRoot/administrator/components/com_content/src/Extension/ContentComponent.php
, дляcom_example
—Root/administrator/components/com_example/src/Extension/ExampleComponent.php
Сразу после создания экземпляра класса расширения компонента код библиотеки Joomla вызовет метод boot
вашего класса расширения, передавая дочерний экземпляр Контейнера внедрения зависимостей (Dependency Injection Container):
$extension->boot($container);
По сути, это возможность делать буквально всё, что вам нужно. Например, метод иногда используется для настройки определённых классов, которые будут использоваться с вызовами HtmlHelper::_()
. Или же можно сохранить ссылку на ваш дочерний DI-контейнер (который иначе может быть сложно получить).
После первого создания экземпляра вашего компонента Joomla кэширует этот экземпляр. При повторном вызове
$extension = $app->bootComponent("com_example");
Joomla просто возвращает существующий экземпляр вашего класса расширения, вместо повторного создания объекта и вызова метода boot()
. Вы даже можете вызвать bootComponent
, передав свой компонент, чтобы получить ссылку на свой собственный объект расширения.