¿Cómo inyectar valores de configuración en los servicios?

8

En Symfony 2, al definir un servicio, es posible inyectar parámetros de configuración haciendo referencia a ellos con %parameter.name%cadenas. Por ejemplo:

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

Pero, ¿cuál es el enfoque correcto de Drupal 8 para inyectar valores de configuración en los servicios? Por supuesto que no quiero usar \Drupal::config()dentro de una clase de servicio. Pasar valores de configuración cada vez que se hace referencia a un servicio tampoco tiene mucho sentido.

Sé que puedo inyectar el servicio de configuración en sí y luego obtener los valores de configuración, pero eso parece un poco malo ya que mi servicio en sí mismo sabe cómo leer datos del servicio de configuración. Por ejemplo:

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

Hay alguna otra manera de hacer esto?

SiliconMind
fuente
1
El enfoque D8 es utilizar el @config.factoryservicio para obtener la configuración del servicio de configuración. Esto se debe a que el servicio de configuración podría anularse y no necesariamente obtener sus valores de configuración desde el mismo lugar.
mradcliffe

Respuestas:

7

Puede usar una fábrica para su app.mailerservicio. La fábrica se encarga de recuperar la configuración del servicio. El servicio puede permanecer desacoplado del servicio de configuración y no necesita saber cómo se nombran los parámetros de configuración.

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;
  }
}
Pierre Buyle
fuente
1
Estoy confundido, porque esperaba ver 2 definiciones de servicio, similares a los ejemplos dados en webomelette.com/more-complex-services-using-factories-drupal-8 , dado este ejemplo, ¿cómo puedo inyectar otro servicio a la Mailerclase? ?
Miloš Kroulík
3

Esa es la manera de hacerlo. La configuración puede cambiar en tiempo de ejecución, la definición del servicio generalmente es persistente y la modificación es costosa. Asumiendo que es una configuración que desea que los usuarios cambien.

Si no es así, puede usar parámetros, como en el ejemplo de Symfony. Luego puede poner su configuración en services.yml en sites / default. Pero solo puede cambiarlo cambiando el código y reconstruyendo el contenedor.

Berdir
fuente
Bien, esto básicamente significa que un servicio necesita saber cómo se nombran los parámetros de configuración para obtenerlos del servicio de configuración de fábrica. Un poco incómodo y hace que las pruebas sean más complicadas. ¿Hay algún tipo de trozo de configuración de fábrica para fines de prueba?
SiliconMind