组件的扩展类
在许多情况下,其他 Joomla 代码可能需要与我们的组件进行交互,例如
- 路由器可能希望使用我们组件的自定义路由器来解析和构建 SEF 路由
- 如果我们的组件支持类别,则
com_categories
将希望在类别视图中显示按类别划分的摘要,其中包含该类别的项目数量,并按发布状态细分 - 如果我们的组件支持自定义字段,则
com_fields
将希望调用getContexts()
以获取可以与之关联自定义字段的项目类型 - 如果我们的组件支持多语言关联,则
com_associations
将希望知道可以具有关联的项目类型。 - 当然,Joomla 将希望运行我们的组件以捕获网页的输出。
如果我们回顾其他 Joomla 代码如何在 Joomla 3 中与我们的扩展进行交互,那么引入扩展类的理由就会变得更加清晰。
在 Joomla 3 中,所有这些其他代码片段都以一种相当杂乱的方式深入到我们组件的代码库中——在各种帮助程序文件中调用函数。
在 Joomla 4 中,这一点得到了简化
从 Joomla 4 开始,组件可以通过调用以下方式获取我们 com_example
组件的句柄
$extension = $app->bootComponent("com_example");
然后,它们可以在此扩展实例上调用其所需的函数。
在组件扩展类实例化之后,Joomla 库代码将调用您的扩展的 boot
函数,并传递您的子依赖注入容器实例
$extension->boot($container);
这只是一个机会,让您可以做任何您想做的事情。有时它用于设置特定类以与 HtmlHelper::_()
调用一起使用。或者您可以使用它来保存对子 DIC 的引用(否则很难获得)。
在第一次实例化您的组件后,Joomla 会缓存该实例,如果再次调用
$extension = $app->bootComponent("com_example");
它只会返回您的扩展实例,而不是再次执行类实例化和 boot()
的调用。您甚至可以调用 bootComponent
并传递您自己的组件,如果您需要获取对您自己的扩展对象的引用。