Modo corretto di chiamare un servizio in un controller


10

Sono nuovo di servizi (e drupal 8!) E sto cercando di capire i servizi. Penso che forse sto solo facendo la creazione in un modo obsoleto. Quello che voglio fare è rendere il mio "ciao generatore" un servizio e chiamarlo in un altro controller con il seguente:

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

spazio dei nomi 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'

Puoi seguire il documento . È il modo corretto di chiamare un servizio in un controller
MrD

Risposte:


22

Ci sono 3 domande qui:

  1. Come creare un controller?
  2. Come creare un servizio?
  3. Come utilizzare i servizi in un controller?

1. Creare un controller

1.1 Aggiungi una classe controller - ce l' hai fatta. Per altri consultare la documentazione di Drupal

1.2 Aggiungi un file di routing : sembra che manchi questo codice:

my_module.routing.yml

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

vedi la documentazione di Drupal

2. Creare un servizio

2.1 Aggiungi una classe di servizio - ce l' hai fatta.

2.2 Aggiungere un file di routing : lo hai fatto sebbene contenga codice aggiuntivo che appartiene al file di routing. Questo è tutto ciò che serve:

my_module.services.yml

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

vedi la documentazione di Drupal

3. Utilizzare i servizi in un controller

Ce l'hai fatta. Ecco un riferimento per gli altri:

3.1 Sostituire il create()metodo

La classe controller eredita questo metodo da class ControllerBase. Il suo ruolo è quello di creare l'oggetto controller. Guarda l'argomento del metodo: viene passato il contenitore dei servizi. Estrai i servizi di cui hai bisogno e passali al costruttore:

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 Inizializzare i servizi in __construct()

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

3.3 Inizia a utilizzare i servizi


4
Vorrei che la documentazione ufficiale fosse più in questo stile, o almeno avesse alcuni articoli di sintesi che era. Breve e conciso con un esempio generico facilmente traducibile nella vera applicazione.
Nicolaj,

A non dimenticare: usa Symfony \ Component \ DependencyInjection \ ContainerInterface; in classe controller
Atep

Anche se sono totalmente d'accordo con il commento di @ Nicolaj, questo non funziona per me ... e non sto nemmeno cercando di usare un servizio personalizzato! Tutto quello che voglio fare è creare una variabile membro di classe che contiene un oggetto di connessione al database statico. Sono abituato a utilizzare sistemi in cui il pool di connessioni e non creare mai più connessioni di quelle necessarie è la norma. Quindi come implementare qualcosa di simile in un controller / modulo Drupal?
Kenny83,

Potresti voler aprire un'altra domanda @ Kenny83, ma hai mai guardato api.drupal.org/api/drupal/core%21lib%21Drupal.php/function/… ? Con ciò puoi fare qualcosa del genere: gist.github.com/glaux/f4f1517563ddb57fb98b9213802c1569
Nicolaj

@Nicolaj LOL grazie per aver sottolineato il compagno evidentemente sanguinante: P Sono ben consapevole del servizio di database di base ed è quello che sto cercando di tornare dal mio create()metodo. Suppongo che non avrebbe detto che anche se se non avessi perso qualcosa che avrebbe dovuto essere ovvio ... Credo che il servizio fa gli oggetti di connessione piscina?
Kenny83,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.