Injección de dependéncias en plugins con Drupal 8

Algo muy común cuando se esta desarrollando un modulo en Drupal 8, es utilizar plugins. Los plugins son el componente mas complejo de Drupal, al cual se les pueden inyectar dependencias, pero por defecto, no las soportan, tenemos que añadirle esa capacidad.

Cuando estamos creando por ejemplo un bloque y tenemos que utilizar algún servicio, lo que a muchos haríamos primero, seria usar \Drupal::service('nombre_servicio'), y esto es algo, que solo se debería de hacer en el archivo .module si queremos seguir buenas practicas.

Inyectando dependencias

Realizarlo es sencillo, pero requiere un poquito de código extra que si utilizamos directamente \Drupal::service(). Lo primero, es implementar la interfaz ContainerFactoryPluginInterface para poder crear el método estático "create" e inyectar los servicios que necesitemos a través del constructor.

namespace Drupal\nireneko\Plugin\Block;

use Drupal\Core\Block\BlockBase;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
*
* @Block(
*   id = "nireneko_block",
*   admin_label = @Translation("Nireneko Block"),
* )
*/
class NirenekoBlock extends BlockBase implements ContainerFactoryPluginInterface {

  /**
   * The Entity Type Manager service.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
   * @param array $configuration
   * @param string $plugin_id
   * @param mixed $plugin_definition
   *
   * @return static
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('entity_type.manager')
    );
  }

  /**
   * @param array $configuration
   * @param string $plugin_id
   * @param mixed $plugin_definition
   * @param EntityTypeManagerInterface $entityTypeManager
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entityTypeManager) {
        parent::__construct($configuration, $plugin_id, $plugin_definition);
        $this->entityTypeManager = $entityTypeManager;
  }
}

Y listo!! Es mucho mas código que utilizando directamente la clase estática Drupal, pero son buenas practicas a seguir :)

Artículo original

Total de votos: 6

Entradas relacionadas

Comentarios (0)

Deja un comentario