Eu sou novo em serviços (e drupal 8!) E estou tentando descobrir serviços. Eu acho que talvez eu esteja apenas criando um desatualizado. O que eu quero fazer é tornar meu 'hello generator' um serviço e chamá-lo em outro controlador com o seguinte:
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
espaço para nome 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'
Respostas:
Existem 3 perguntas aqui:
1. Crie um controlador
1.1 Adicione uma classe de controlador - você fez isso. Para outros, consulte a documentação do Drupal
1.2 Adicione um arquivo de roteamento - parece que está faltando no seu código:
my_module.routing.yml
consulte a documentação do Drupal
2. Crie um serviço
2.1 Adicione uma classe de serviço - você fez.
2.2 Adicionar um arquivo de roteamento - você o fez, embora ele contenha código extra que pertença ao arquivo de roteamento. Isso é tudo que você precisa:
my_module.services.yml
consulte a documentação do Drupal
3. Use serviços em um controlador
Você fez isso. Aqui está uma referência para outras pessoas:
3.1 Substituir o
create()
métodoA classe do controlador herda esse método de
class ControllerBase
. Seu papel é criar o objeto do controlador. Observe o argumento do método: é passado o contêiner de serviços. Extraia os serviços necessários e passe-os para o construtor:3.2 Inicializar serviços em
__construct()
3.3 Comece a usar os serviços
fonte
create()
método. Eu suponho que você não teria dito que, embora se eu não tivesse perdido alguma coisa outra coisa que deveria ter sido óbvio ... Eu acho que o serviço faz objetos de conexão piscina?