Em um controlador, você injeta serviços usando o contêiner de serviço. Por exemplo 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')
);
}
Em seguida, você pode evitar \Drupal
chamadas usando o serviço injetado:
$this->moduleHandler->alter('mymodule_myfunction', $plugin_items);
Você pode injetar qualquer serviço, existente do núcleo / contrib ou serviços que você definiu no código personalizado em um *.services.yml
arquivo.
Para encontrar um nome de serviço principal, costumo procurar core.services.yml
, porque essa é a maneira mais rápida quando você está trabalhando em um projeto drupal no seu IDE.
Você pode usar o Drupal Console para listar todos os serviços, não apenas do núcleo:
drupal debug:container
Você também pode usar o módulo Devel , que permite procurar um nome:
/devel/container/service
create
sobrecarregará o método pai - aqui você pode injetar os serviços necessários. O construtor, então, permitem atribuir os a variáveis de instância na classe, assim você pode usar$this->fooInjectedClass->methodName()