Como crear un servicio en Drupal 8 (parte 2)

Vamos a continuar con la creación del servicio para Drupal 8. En la primera parte, explicamos que es un servicio y creamos una clase la cual unicamente instanciamos y usamos, lo que nos falta es definir la clase creada como un servicio, he integrarla en el controlador que tenemos. Manos a la obra!

Definir el servicio

Para definir un servicio dentro de un modulo, lo que debemos hacer es crear el archivo yml que define los servicios dentro del modulo, este archivo lo llamaremos drupaleros.services.yml y dentro escribiremos lo siguiente:

services:
    drupaleros.repeater:
        class: Drupal\drupaleros\services\DrupalerosRepeater

Con esto ya tenemos definido el servicio, y que clase utilizara (poniendo su namespace). Ahora tenemos que añadir el servicio a nuestro controlador, vamos a ver como hacerlo.

Añadir el servicio al controlador

Nos vamos al controlador que tenemos de la primera parte, y hacemos que exitenda de la claseControllerBase”, tambien debemos añadir “use” para la clase de la cual vamos a extender de modo que quede asi:

<?php

namespace Drupal\drupaleros\Controller;

use Drupal\Core\Controller\ControllerBase;
use Drupal\drupaleros\services\DrupalerosRepeater;
use Symfony\Component\HttpFoundation\Response;

class DrupalerosController extends ControllerBase

Ahora que estamos extendiendo de la clase “ControllerBase” podemos sobre-escribir sus metodos para modificarlos como queramos. El metodo que sobre-escribiremos es “create”, el parametro que recibimos con el metodo “create” es el contenedor, a si que debemos añadir la clase “ContainerInterface” a los “use”:

<?php

namespace Drupal\drupaleros\Controller;

use Drupal\Core\Controller\ControllerBase;
use Drupal\drupaleros\services\DrupalerosRepeater;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Response;
[...]

public static function create(ContainerInterface $container) {

}

Ahora vamos a añadir el servicio a al controlador a traves del metodo “create” que hemos sobreescrito:

public static function create(ContainerInterface $container) {

  $repeater = $container->get('drupaleros.repeater');
  return new static($repeater);

}

Ahora que ya añadimos el servicio “drupaleros.repeater” que es el que hemos definido al inicio, tenemos que añadir un constructor a la clase, para poder almacenar en un atributo private de la clase el servicio:

[…]

class DrupalerosController extends ControllerBase {

  private $repeater;

  public function __construct(DrupalerosRepeater $repeater) {
  
    $this->repeater = $repeater;
  
  }

[…]

Ahora ya tenemos el servicio disponible en todo nuestro controlador al haberlo metido en un atributo de la clase. A si que solamente nos queda utilizarlo en el metodo “say” de la siguiente manera:

public function say($count) {

  $response_text = $this->repeater->getSay($count);

  return new Response($response_text);

}

Por ultimo, dejo todo el codigo completo de la clase del controlador, por si ha habido alguna confusion, ya que ha habido mucho movimiento de metodos y pequeñas ediciones:

<?php

namespace Drupal\drupaleros\Controller;

use Drupal\Core\Controller\ControllerBase;
use Drupal\drupaleros\services\DrupalerosRepeater;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Response;

class DrupalerosController extends ControllerBase {

  private $repeater;

  public function __construct(DrupalerosRepeater $repeater) {

    $this->repeater = $repeater;

  }

  public function say($count) {

    $response_text = $this->repeater->getSay($count);
    return new Response($response_text);

  }

  public static function create(ContainerInterface $container) {

    $repeater = $container->get('drupaleros.repeater');
    return new static($repeater);

  }

}

Como vemos, utilizar un servicio en un controlador puede parecer un poco complicado ya que hay que sobre-escribir un metodo, hacer que el metodo reinstancie la clase pasandole el parametro necesario, y en el constructor almacenar el servicio en un atributo de la clase para poder usarlo en cualquier lugar de la clase.

Ir a parte 1

 

Total de votos: 41

Entradas relacionadas

Comentarios (0)

Deja un comentario