跳至主要内容
版本:5.1

依赖注入问题

依赖注入在 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 中所述。