Forma correcta de llamar a un servicio en un controlador

10

Soy nuevo en servicios (¡y drupal 8!) Y estoy tratando de descubrir los servicios. Creo que tal vez solo estoy haciendo la creación de una manera anticuada. Lo que quiero hacer es hacer que mi 'generador de hola' sea un servicio y llamarlo en otro controlador con lo siguiente:

DBController.php

namespace Drupal\db\Controller;

use Drupal\Core\Controller\ControllerBase;
use Drupal\db\DbServices\HelloGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Response;


class DBController extends ControllerBase
{
private $helloGenerator;

public function __construct(HelloGenerator $x) {
    $this->helloGenerator = $x;
}
public function say($count) {
    $hello = $this->helloGenerator->getHello($count);

    return new Response($hello);
}

public static function create(ContainerInterface $container) {
    $x = $container->get('db.hello_generator');
    return new static ($x);
}
}

HellGenerator.php

espacio de nombres Drupal \ db \ DbServices;

class HelloGenerator {

public function getHello($count) {
    $foo = 4 + 4 + 4;
    return $foo . ' ' . $count;
}

}

db.services.yml

services:
  db.hello_generator:
     class: Drupal\db\DbServices\HelloGenerator

db.db_says:
  path: /db/says/{count}
  defaults:
    _controller: '\Drupal\db\Controller\DBController::say'
  requirements:
    _permission: 'access content'
karl
fuente
Puedes seguir el documento . Es la forma correcta de llamar a un servicio en un controlador
MrD

Respuestas:

22

Hay 3 preguntas aquí:

  1. ¿Cómo crear un controlador?
  2. ¿Cómo crear un servicio?
  3. ¿Cómo usar los servicios en un controlador?

1. Crear un controlador

1.1 Agregue una clase de controlador : lo hizo. Para otros, consulte la documentación de Drupal

1.2 Agregue un archivo de enrutamiento : parece que falta en su código:

my_module.routing.yml

my_module.my_route_name:
  path: '/my/path'
  defaults:
    _controller: '\Drupal\my_module\Controller\MyController::myAction'
  requirements:
    _permission: 'access content'

ver documentación de Drupal

2. Crear un servicio

2.1 Agregue una clase de servicio : lo hizo.

2.2 Agregue un archivo de enrutamiento : lo hizo aunque contiene código adicional que pertenece al archivo de enrutamiento. Esto es todo lo que necesita:

my_module.services.yml

services:
  my_module.my_service:
    class: Drupal\my_module\Service\MyService

ver documentación de Drupal

3. Use los servicios en un controlador

Lo hiciste. Aquí hay una referencia para otros:

3.1 Anular el create()método

La clase de controlador hereda este método de class ControllerBase. Su función es crear el objeto controlador. Mire el argumento del método: se pasa el contenedor de servicios. Extraiga los servicios que necesita y páselos al constructor:

public static function create(ContainerInterface $container) {
    $my_service = $container->get('my_module.my_service');
    $other_service = $container->get('other_service');

    return new static($my_service, $other_service);
}

3.2 Inicializar servicios en __construct()

public function __construct($my_service, $other_service)
{
    $this->my_service = $my_service;
    $this->other_service = $other_service;
}

3.3 Comience a usar los servicios

zendka
fuente
44
Desearía que la documentación oficial fuera más de este estilo, o al menos tuviera algunos artículos de resumen. Breve y conciso con un ejemplo genérico fácilmente traducido a la aplicación real.
Nicolaj
A no olvide: use Symfony \ Component \ DependencyInjection \ ContainerInterface; en clase controlador
Atep
Si bien estoy totalmente de acuerdo con el comentario de @ Nicolaj, esto no funciona para mí ... ¡y ni siquiera estoy tratando de usar un servicio personalizado! Todo lo que quiero hacer es crear una variable miembro de clase que contenga un objeto de conexión de base de datos estático. Estoy acostumbrado a usar sistemas donde la agrupación de conexiones y nunca crear más conexiones de las que necesita es la norma. Entonces, ¿cómo implementaría algo similar en un controlador / formulario Drupal?
Kenny83
Es posible que desee abrir otra pregunta @ Kenny83, pero ¿ha examinado api.drupal.org/api/drupal/core%21lib%21Drupal.php/function/… ? Con eso puedes hacer algo como esto: gist.github.com/glaux/f4f1517563ddb57fb98b9213802c1569
Nicolaj
@Nicolaj LOL, gracias por señalar a la compañera extremadamente obvia: P Conozco bien el servicio de base de datos central y eso es lo que estoy tratando de devolver de mi create()método. Supongo que no habría dicho eso, aunque si no hubiera perdido algo más que debería haber sido obvio ... supongo que el servicio hace objetos de conexión de la piscina?
Kenny83