En un controlador, inyecta servicios utilizando el contenedor de servicios. Por ejemplo 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')
);
}
Entonces puedes evitar \Drupal
llamadas utilizando el servicio inyectado:
$this->moduleHandler->alter('mymodule_myfunction', $plugin_items);
Puede inyectar cualquier servicio, los existentes desde el núcleo / contrib o los servicios que ha definido en un código personalizado en un *.services.yml
archivo.
Para encontrar un nombre de servicio principal, generalmente busco core.services.yml
, porque esa es la forma más rápida cuando está trabajando en un proyecto drupal en su IDE.
Puede usar la Consola Drupal para enumerar todos los servicios, no solo desde el núcleo:
drupal debug:container
También puede usar el módulo Devel , que le permite buscar un nombre:
/devel/container/service
create
sobrecargará el método principal; aquí puede inyectar los servicios que necesita. El constructor le permitirá asignarlos a las variables de instancia en la clase, para que pueda usar$this->fooInjectedClass->methodName()