02 - Класс диспетчера для компонентов
Класс Dispatcher вступает в действие всякий раз, когда Joomla собирается запустить компонент, чтобы получить выходные данные для отображения на веб-странице. У класса есть одна основная функция: dispatch()
, который будет запускать компонент.
Итак, чтобы запустить компонент, вы сначала получаете его класс расширения, а затем:
$extension->getDispatcher()->dispatch();
Как класс расширения Extension получает экземпляр класса Dispatcher через вызов getDispatcher()
, описано в документации по внедрению зависимостей; вы найдете код для getDispatcher()
в libraries/src/Extension/Component.php - класс компонента Component в этом файле находится в цепочке наследования экземпляра расширения.
(Возможно, вам интересно, почему в классе расширения нет просто функции dispatch(), вместо того, чтобы иметь этот дополнительный класс Dispatcher. Я думаю, это потому, что дизайнеры Joomla хотели иметь общий шаблон расширения / диспетчера среди компонентов, модулей и плагинов, а класс диспетчера для плагинов намного сложнее.)
Для компонентов основное назначение кода диспетчера dispatch()
заключается в том, чтобы
- определите, какой контроллер компонента использовать, а затем
- создайте его экземпляр
- вызвать его метод
execute()
– в основном запуск компонента MVC, начиная с контроллера - вызвать его метод
redirect()
(для обработки случаев, когда требуется HTTP-перенаправление)
Он определяет используемый контроллер, исследуя параметры HTTP-запроса, в частности параметр task. Он использует task, рассматривая его части как <controller type>.<method>
(по умолчанию используется 'display', если какая-либо из частей отсутствует). Затем будет
- создан экземпляр класса
<Controller type>Controller
- вызвана его функция
<method>
Если параметр task отсутствует, то он будет создан DisplayController
и вызван ее метод display()
.
Контроллер будет иметь префикс пространства имен сайта или администратора, чтобы сформировать полное имя класса.
(Если вы знакомы с компонентами Joomla 3, то, вероятно, теперь понимаете, что это в основном то же самое, что было бы у вас в файле точки входа, как описано в Joomla 3 Model-View-Controller. Параметр task обрабатывается почти таким же образом в Joomla 4, за исключением того, что DisplayController теперь лучше сочетается с другими контроллерами. Кстати, вы можете увидеть для некоторых компонентов Joomla знак AjaxController.php. Joomla не изучила бит XHR и решила перенаправить его на AjaxController из-за этого. Скорее это потому, что клиентский javascript установил 'ajax.something' в параметре задачи HTTP-запроса Ajax.)
Если ваш компонент использует параметр task, как описано выше, для маршрутизации к соответствующему контроллеру и методу, то вам, вероятно, не нужно определять свой собственный класс Dispatcher и вы можете использовать стандартный класс ComponentDispatcher, предоставляемый Joomla в libraries/src/Dispatcher/ComponentDispatcher.php.