Je suis nouveau dans les services (et drupal 8!) Et j'essaie de comprendre les services. Je pense que je fais peut-être juste la création d'une manière obsolète. Ce que je veux faire, c'est 'Bonjour générateur' un service et appelez-le dans un autre contrôleur avec ce qui suit:
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
espace de noms 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'
Il y a 3 questions ici:
1.1 Ajoutez une classe de contrôleur - vous l'avez fait. Pour les autres voir Drupal
1.2 Ajoutez un fichier de routage - il semble que cela manque dans votre code:
my_module.routing.yml
my_module.my_route_name:
path: '/my/path'
defaults:
_controller: '\Drupal\my_module\Controller\MyController::myAction'
requirements:
_permission: 'access content'
2.1 Ajoutez une classe de service - vous l'avez fait.
2.2 Ajouter un fichier de routage - vous l'avez fait bien qu'il contienne du code supplémentaire qui appartient au fichier de routage. C'est tout ce dont vous avez besoin:
my_module.services.yml
services:
my_module.my_service:
class: Drupal\my_module\Service\MyService
Tu l'as fait. Voici une référence pour les autres:
3.1 Remplacer la méthode create()
La classe contrôleur hérite de cette méthode de class ControllerBase
. Son rôle est de créer l'objet contrôleur. Regardez l'argument de la méthode: il est passé le conteneur de services. Extrayez les services dont vous avez besoin et transmettez-les au constructeur:
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 Initialiser les services dans __construct()
public function __construct($my_service, $other_service)
{
$this->my_service = $my_service;
$this->other_service = $other_service;
}
3.3 Commencez à utiliser les services