
Drupal 8: Sobrescribiendo un servicio usando ServiceProvideBase
Autor: fjavimartin
Fecha de Creación: 22/01/2018
Categorías:
En el último artículo describimos como crear un servicio básico, en este modificaremos el servicio ya creado extendiendo la clase ServiceProvideBase.
Conocemos como crear nuestro propio servicio, pero …..¿Que pasa si necesitamos sobrescribir uno existente? Para completar esta misión con éxito deberemos crear una clase nueva que extienda de la clase ServiceProvideBase y dejaremos en el directorio src de nuestro módulo.
Para nuestro ejemplo sobrescribiremos el servicio que creamos en nuestra última entrada de blog: ‘equipos_services.helloworld’:
<?php
namespace Drupal\equipos_services;
use Drupal\Core\DependencyInjection\ServiceProviderBase;
use Drupal\Core\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
class OverrideService extends ServiceProviderBase {
public function alter(ContainerBuilder $container) {
$definition = $container->getDefinition('equipos_services.helloworld');
$definition->setClass('Drupal\equipos_services\AlterHelloWorldService');
$definition->setArguments([
new Reference('logger.factory'),
new Reference('current_user'),
new Reference('entity.manager')
]);
}
}
En este pequeño código lo único que hacemos es capturar la definición del servicio directamente desde el contenedor, fijar la nueva clase (AlterHelloWorldService) y añadir un argumento nuevo que será ‘entity.manager’, nuevo servicio como argumento que nos permitirá acceder a las entidades del sistema.
Disfrutar!!!!
Referencias
http://kevinquillen.com/drupal/2017/07/10/overriding-services-in-drupal-8-with-serviceprovidebase
https://www.drupal.org/docs/8/api/services-and-dependency-injection/structure-of-a-service-file
https://api.drupal.org/api/drupal/core%21core.services.yml/8.4.x
http://www.e-quipos.es/blog/drupal-8-creando-nuestro-primer-servicio
http://www.e-quipos.es/blog/drupal-8-inyecci%C3%B3n-de-servicios