No Symfony 2, ao definir um serviço, é possível injetar parâmetros de configuração referenciando-os com %parameter.name%
strings. Por exemplo:
services:
app.mailer:
class: AppBundle\Mailer
arguments: ['%app.mailer.transport%']
Mas qual é a abordagem correta do Drupal 8 para injetar valores de configuração nos serviços? Claro que não quero usar \Drupal::config()
dentro de uma classe de serviço. A passagem de valores de configuração sempre que um serviço é referenciado também não faz muito sentido.
Eu sei que posso injetar o próprio serviço de configuração e obter valores de configuração, mas isso parece um pouco ruim porque meu próprio serviço sabe ler dados do serviço de configuração. Por exemplo:
# Yaml service configuration
services:
app.mailer:
class: mail_module\Mailer
arguments: ['@config.factory']
PHP
<?php
class Mailer {
public function __construct($config) {
$this->mailTransport = $config->get('mail.config')->get('transport');
}
}
Existe alguma outra maneira de fazer isso?
@config.factory
serviço para obter a configuração do serviço de configuração. Isso ocorre porque o serviço de configuração pode ser substituído e não necessariamente obtendo seus valores de configuração do mesmo local.Respostas:
Você pode usar uma fábrica para o seu
app.mailer
serviço. A fábrica cuida de recuperar a configuração para o serviço. O serviço pode ficar dissociado do serviço de configuração e não precisa saber como os parâmetros de configuração são nomeados.fonte
Mailer
classe ?É assim que se faz. A configuração pode mudar no tempo de execução, a definição de serviço geralmente é mantida e a reulução é cara. Supondo que seja a configuração que você deseja que os usuários alterem.
Caso contrário, você pode usar parâmetros, como no exemplo do symfony. Em seguida, você pode colocar sua configuração em services.yml em sites / padrão. Mas você só pode alterá-lo alterando o código e reconstruindo o contêiner.
fonte
Você pode usar um serviço de fábrica ou configurador que esteja ciente de como a fábrica de configuração funciona, etc., que mantém seu serviço desacoplado da fábrica de configuração. O cliente HTTP no núcleo possui um configurador, se você precisar de um exemplo. Consulte https://symfony.com/doc/current/service_container/configurators.html#using-the-configurator para obter documentos.
fonte