it-swarm.com.de

Richtige Methode zum Aufrufen eines Dienstes in einer Steuerung

Ich bin neu in Diensten (und drupal 8!) Und versuche, Dienste herauszufinden. Ich denke, ich mache das Erstellen vielleicht nur auf veraltete Weise. Was ich tun möchte, ist, meine zu machen 'Hallo Generator' einen Dienst und rufen Sie ihn in einem anderen Controller mit den folgenden auf:

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

namespace 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'
10
karl

Hier gibt es 3 Fragen:

  1. Wie erstelle ich einen Controller?
  2. Wie erstelle ich einen Service?
  3. Wie verwende ich Dienste in einem Controller?

1. Erstellen Sie einen Controller

1.1 Fügen Sie eine Controller-Klasse hinzu - Sie haben es geschafft. Für andere siehe Drupal Dokumentation

1.2 Fügen Sie eine Routing-Datei hinzu - es sieht so aus, als ob dies in Ihrem Code fehlt:

my_module.routing.yml

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

siehe Drupal Dokumentation

2. Erstellen Sie einen Service

2.1 Fügen Sie eine Serviceklasse hinzu - Sie haben es geschafft.

2.2 Fügen Sie eine Routing-Datei hinzu - Sie haben es getan, obwohl sie zusätzlichen Code enthält, der zur Routing-Datei gehört. Das ist alles was Sie brauchen:

my_module.services.yml

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

siehe Drupal Dokumentation

3. Verwenden Sie Dienste in einem Controller

Du hast es geschafft. Hier ist eine Referenz für andere:

3.1 Überschreiben Sie die Methode create()

Die Controller-Klasse erbt diese Methode von class ControllerBase. Seine Aufgabe besteht darin, das Controller-Objekt zu erstellen. Beobachten Sie das Methodenargument: Es wird der Service-Container übergeben. Extrahieren Sie die benötigten Services und übergeben Sie sie an den Konstruktor:

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 Dienste in __construct() initialisieren

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

3.3 Starten Sie die Dienste

21
zendka