Dans Symfony 2 lors de la définition d'un service, il est possible d'injecter des paramètres de configuration en les référençant avec des %parameter.name%
chaînes. Par exemple:
services:
app.mailer:
class: AppBundle\Mailer
arguments: ['%app.mailer.transport%']
Mais quelle est la bonne approche Drupal 8 pour injecter des valeurs de configuration dans les services? Bien sûr, je ne veux pas utiliser \Drupal::config()
dans une classe de service. Passer des valeurs de configuration chaque fois qu'un service est référencé n'a pas beaucoup de sens non plus.
Je sais que je peux injecter le service de configuration lui-même puis en obtenir des valeurs de configuration, mais cela semble un peu merdique car mon service lui-même sait lire les données du service de configuration. Par exemple:
# 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');
}
}
Y a-t-un autre moyen de faire ça?
@config.factory
service pour obtenir la configuration à partir du service de configuration. Cela est dû au fait que le service de configuration peut être remplacé et ne pas nécessairement obtenir ses valeurs de configuration au même endroit.Réponses:
Vous pouvez utiliser une usine pour votre
app.mailer
service. L'usine prend soin de récupérer la configuration du service. Le service peut rester découplé du service de configuration et n'a pas besoin de savoir comment les paramètres de configuration sont nommés.la source
Mailer
classe ?C'est la façon de le faire. La configuration peut changer au moment de l'exécution, la définition du service est généralement persistante et la reconstitution est coûteuse. En supposant que c'est la configuration que vous souhaitez que les utilisateurs changent.
Si ce n'est pas le cas, vous pouvez utiliser des paramètres, tout comme l'exemple symfony. Ensuite, vous pouvez mettre votre configuration dans services.yml dans sites / default. Mais vous ne pouvez le changer qu'en changeant le code et en reconstruisant le conteneur.
la source
Vous pouvez utiliser un service d'usine ou de configurateur qui sait comment fonctionne l'usine de configuration, etc., qui maintient votre service découplé de l'usine de configuration. Le client HTTP dans le noyau a un configurateur si vous avez besoin d'un exemple. Voir https://symfony.com/doc/current/service_container/configurators.html#using-the-configurator pour les documents.
la source