在控制器中,您可以使用服务容器注入服务。例如ModuleHandler
:
namespace Drupal\mymodule\Controller;
use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
class MyController extends ControllerBase {
/**
* The module handler service.
*
* @var \Drupal\Core\Extension\ModuleHandlerInterface
*/
protected $moduleHandler;
/**
* Constructs a MyController object
*
* @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
* The module handler service.
*/
public function __construct(ModuleHandlerInterface $module_handler) {
$this->moduleHandler = $module_handler;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('module_handler')
);
}
然后,您可以\Drupal
通过使用注入的服务来避免呼叫:
$this->moduleHandler->alter('mymodule_myfunction', $plugin_items);
您可以将任何服务,来自核心/贡献的现有服务或您在*.services.yml
文件中的自定义代码中定义的服务注入。
通常core.services.yml
,我会寻找一个核心服务名称,因为这是在IDE中处理drupal项目时最快的方法。
您可以使用Drupal Console列出所有服务,而不仅限于核心:
drupal debug:container
您还可以使用Devel模块,该模块允许您搜索名称:
/devel/container/service
create
将重载父方法-您可以在此处注入所需的服务。然后,构造函数将允许您将这些变量分配给类中的实例变量,以便您可以使用$this->fooInjectedClass->methodName()