Класс Dispatcher вступает в действие всякий раз, когда Joomla собирается запустить компонент, чтобы получить выходные данные для отображения на веб-странице. У класса есть одна основная функция: dispatch(), который будет запускать компонент.

Итак, чтобы запустить компонент, вы сначала получаете его класс расширения, а затем:

$extension->getDispatcher()->dispatch();

Как класс расширения Extension получает экземпляр класса Dispatcher через вызов getDispatcher(), описано в документации по внедрению зависимостей; вы найдете код для getDispatcher() в libraries/src/Extension/Component.php - класс компонента Component в этом файле находится в цепочке наследования экземпляра расширения.

(Возможно, вам интересно, почему в классе расширения нет просто функции dispatch(), вместо того, чтобы иметь этот дополнительный класс Dispatcher. Я думаю, это потому, что дизайнеры Joomla хотели иметь общий шаблон расширения / диспетчера среди компонентов, модулей и плагинов, а класс диспетчера для плагинов намного сложнее.)

Для компонентов основное назначение кода диспетчера dispatch() заключается в том, чтобы

  1. определите, какой контроллер компонента использовать, а затем
  2. создайте его экземпляр
  3. вызвать его метод execute() – в основном запуск компонента MVC, начиная с контроллера
  4. вызвать его метод 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.