依赖注入问题
依赖注入在 Joomla 4 中引入,目的是避免通过 `getInstance()` 调用(包括通过 `Factory::` 调用)直接访问大多数关键类,Joomla 4 中已弃用许多此类 API 调用。请注意,并非所有 `getInstance()` 调用都已弃用;未弃用的示例包括 `Uri::getInstance()` 和 `Filter\InputFilter::getInstance()`。
但是,仍然存在一些您应该注意的问题。Joomla 5 的早期版本仍然存在许多这些 `getInstance` 调用!
Toolbar::getInstance()
Toolbar
类用于管理 Joomla 后台表单上的按钮。 Toolbar API 文档似乎建议我们应该替换
$bar = Toolbar::getInstance('toolbar');
为
$bar = Factory::getContainer()->get(ToolbarFactoryInterface::class)->createToolbar('toolbar');
但是,这目前无法正常工作。问题在于所有其他 Joomla 代码都使用 `getInstance('toolbar')` 来访问 Toolbar 类,包括渲染工具栏的 administrator/modules/mod_toolbar/mod_toolbar.php 中的代码。`getInstance` 方法在本地静态变量 `$instances` 中跟踪 Toolbar 实例,并在重复调用时返回相同的 Toolbar 实例。
因此,如果您使用上述第二种方法,您将获得一个 Toolbar 实例,但它不会与存储在 `$instances` 变量中的 Toolbar 实例相同。然后,工具栏模块将无法获取它,因此不会在表单上呈现。
Table::getInstance()
通常,Table 实例是由 MVCFactory 类通过在您的 Model 中调用 `getTable()` 创建的。但是,在其他情况下您可能希望
- 在您的 Table 类代码中,您可能希望另一个您自己的组件表的实例来验证用户输入的 `alias` 字段是否已存在
- 您可能希望访问另一个组件的 Table 类 - 例如 com_categories。
您的组件的 MVCFactory 类无法实现以上两种情况,因为
- 它仅为您的组件创建 Table 类,并且
- 默认情况下,在您的 Table 代码中,您没有指向 MVCFactory 类实例的指针
但是,您可以通过更复杂的方式获得实例,例如对于 com_content
Factory::getApplication()->bootComponent('content')->getMVCFactory()->createTable($name, $prefix, $config);
您还可以使用此方法引导您自己的组件,以获取您自己的 Table 的另一个实例。
Categories::getInstance()
如果您在组件中使用 Categories,那么您可能希望使用 Categories API,例如在自定义路由器中或在站点 CategoryModel 中。调用旧方法
$categories = Categories::getInstance(...);
已弃用。
您可以在实例化扩展时从子 DIC 获取 CategoryFactory,但不幸的是,它不会通过 MVCFactory 类传递到您的 Model。一种可能的解决方案是将 CategoryFactory 引用存储为扩展类的静态变量,如 在您的组件中实现 Categories 中所述。