组件的调度器类
每当 Joomla 想要运行一个组件以捕获输出以在网页上显示时,调度器类就会发挥作用。该类有一个主要函数:dispatch()
,它将运行该组件。
因此,要运行组件,您首先获取其扩展类,然后
$extension->getDispatcher()->dispatch();
扩展类如何通过 getDispatcher()
调用获取调度器类的实例在依赖注入文档中有所介绍;您将在 libraries/src/Extension/Component.php 中找到 getDispatcher()
的代码 - 此文件中的 Component 类位于扩展实例的继承链中。
(您可能想知道为什么扩展类中没有一个 dispatch() 函数,而是要使用额外的调度器类。我认为这是因为 Joomla 设计人员希望组件、模块和插件之间有共同的扩展/调度器模式,而插件的调度器类要复杂得多。)
对于组件,调度器 dispatch()
代码的主要目的是
- 找出要使用的组件控制器,然后
- 实例化它
- 调用其
execute()
方法 - 从控制器开始,基本上运行 MVC 组件 - 调用其
redirect()
方法(用于处理何时需要 HTTP 重定向)
它通过检查 HTTP 查询参数(特别是 task 参数)来确定要使用的控制器。它会根据 <控制器类型>.<方法>
的各个部分来使用 task(如果任一部分缺失,则默认为“display”)。然后它将
- 创建一个类
<控制器类型>Controller
的实例 - 调用其函数
<方法>
如果缺少 task 参数,它将实例化 DisplayController
并调用其 display()
方法。
控制器将以站点或管理员命名空间前缀为前缀,以形成完全限定的类名。
(如果您熟悉 Joomla 3 组件,那么您可能已经意识到这与您在入口点文件中所做的基本相同,如 Joomla 3 模型-视图-控制器 中所述。task 参数在 Joomla 4 中的处理方式基本相同,只是 DisplayController 现在与其他控制器更加契合。顺便说一下,您可能会在某些 Joomla 组件中看到 AjaxController.php。Joomla 没有检查 XHR 位,并因此决定路由到 AjaxController。相反,这是因为客户端 javascript 在 Ajax HTTP 请求的任务参数中设置了“ajax.something”。)
如果您的组件使用上述 task 参数来路由到适当的控制器和方法,那么您可能不需要定义自己的调度器类,可以使用 Joomla 在 libraries/src/Dispatcher/ComponentDispatcher.php 中提供的标准 ComponentDispatcher 类。