Come iniettare i valori di configurazione nei servizi?


8

In Symfony 2 durante la definizione di un servizio è possibile iniettare i parametri di configurazione facendo riferimento a questi con %parameter.name%stringhe. Per esempio:

services:
  app.mailer:
    class:        AppBundle\Mailer
    arguments:    ['%app.mailer.transport%']

Ma qual è l'approccio Drupal 8 corretto all'iniezione dei valori di configurazione nei servizi? Ovviamente non voglio usare \Drupal::config()all'interno di una classe di servizio. Anche il passaggio di valori di configurazione ogni volta che viene fatto riferimento a un servizio non ha molto senso.

So che posso iniettare il servizio di configurazione stesso e quindi ottenere i valori di configurazione da esso, ma sembra un po 'scadente poiché il mio servizio stesso sa come leggere i dati dal servizio di configurazione. Per esempio:

# 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');
  }
}

C'è un altro modo di fare questo?


1
L'approccio D8 consiste nell'utilizzare il @config.factoryservizio per ottenere la configurazione dal servizio di configurazione. Questo perché il servizio di configurazione potrebbe essere sovrascritto e non necessariamente ottenere i suoi valori di configurazione dalla stessa posizione.
mradcliffe,

Risposte:


7

Puoi usare una fabbrica per il tuo app.mailerservizio. La fabbrica si prende cura di recuperare la configurazione per il servizio. Il servizio può rimanere disaccoppiato dal servizio di configurazione e non è necessario conoscere il nome dei parametri di configurazione.

services:
  app.mailer:
    class:       Drupal/mail_module/Mailer
    factory:      Drupal/mail_module/MailerFactory:create
    arguments:    ['@config.factory']


class MailerFactory {
  static function create($config) {
    return new Mailer($config->get('mail.config')->get('transport'));
  }
}

class Mailer {
  public function __construct($transport) {
    $this->mailTransport = $transport;
  }
}

1
Sono confuso, perché mi aspettavo di vedere 2 definizioni di servizio, simili agli esempi forniti in webomelette.com/more-complex-services-using-factories-drupal-8 , Dato questo esempio, come posso iniettare un altro servizio nella Mailerclasse ?
Miloš Kroulík,

3

Questo è il modo di farlo. La configurazione può cambiare in fase di esecuzione, la definizione del servizio è in genere persistente e il rifacimento è costoso. Supponendo sia la configurazione che si desidera che gli utenti cambino.

Altrimenti, puoi usare i parametri, proprio come nell'esempio di symfony. Quindi è possibile inserire la configurazione in services.yml in siti / impostazione predefinita. Ma puoi cambiarlo solo cambiando il codice e ricostruendo il contenitore.


OK, quindi questo in pratica significa che un servizio deve sapere come vengono denominati i parametri di configurazione per ottenerli dal servizio di configurazione di fabbrica. Un po 'imbarazzante e rende i test più complicati. Esiste una specie di stub di configurazione per scopi di test?
SiliconMind

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.