Внедрение зависимостей было введено в Joomla 4 с намерением удалить прямой доступ к большинству ключевых классов через вызовы getInstance(), в том числе через вызовы Factory::, и многие из этих вызовов API в Joomla 4 устарели. Обратите внимание, что не все вызовы getInstance() устарели; например,  не устарели  Uri::getInstance() и Filter\InputFilter::getInstance().

Однако некоторые проблемы остаются, о которых вы должны знать. В ранних версиях Joomla 5 по-прежнему много таких вызовов getInstance!

Toolbar::getInstance()

Класс Toolbar используется для управления кнопками на формах в серверной части администратора Joomla. Документация по Toolbox API, похоже, предполагает, что мы должны заменить

$bar = Toolbar::getInstance('toolbar');

на

$bar = Factory::getContainer()->get(ToolbarFactoryInterface::class)->createToolbar('toolbar');

Однако в настоящее время это не сработает. Проблема в том, что весь остальной код Joomla использует getInstance('toolbar')⁣, чтобы получить доступ к классу Toolbox, включая код в administrator/modules/mod_toolbar/mod_toolbar.php который отображает toolbox. Метод getInstance отслеживает экземпляры панели инструментов в локальной статической переменной $instances, и возвращает один и тот же экземпляр панели инструментов при повторных вызовах.

Таким образом, если вы используете второй подход, описанный выше, вы получите экземпляр панели инструментов, но это будет не тот экземпляр панели инструментов, который хранится в переменной $instances. Затем он не будет получен модулем панели инструментов и, следовательно, не будет отображен в форме.

Table::getInstance()

Обычно экземпляр таблицы создается классом MVCFactory с помощью вызова getTable() в вашей модели. Однако есть и другие случаи, где вам может понадобиться один:

  • в коде вашего класса Table вам может потребоваться другой экземпляр вашей собственной таблицы компонентов, чтобы проверить, существует ли поле alias, введенное пользователем
  • возможно, вы захотите получить доступ к классу таблицы другого компонента - например, com_categories.

Ни то, ни другое невозможно через класс MVCFactory вашего компонента, поскольку

  • он создает табличные классы только для вашего компонента, и,
  • в вашем табличном коде по умолчанию у вас нет указателя на экземпляр класса MVCFactory

Однако вы можете получить экземпляры более сложным путём, например, для com_content

Factory::getApplication()->bootComponent('content')->getMVCFactory()->createTable($name, $prefix, $config);

Вы также можете использовать этот метод для загрузки вашего собственного компонента, чтобы получить другой экземпляр вашей собственной таблицы.

Categories::getInstance()

Если вы используете категории в своем компоненте, вы можете захотеть использовать Categories API, например, в пользовательском маршрутизаторе или в site CategoryModel . Старый метод вызова

$categories = Categories::getInstance(...); 

является устаревшим.

Вы можете получить CategoryFactory из вашего дочернего DIC при создании экземпляра вашего расширения, но, к сожалению, он не передается через класс MVCFactory в вашу модель. Одним из возможных решений является сохранение ссылки CategoryFactory в качестве статической переменной вашего класса расширения, как описано в разделе Реализация категорий в вашем компоненте.