Bagaimana cara menyuntikkan nilai konfigurasi ke dalam layanan?

8

Dalam Symfony 2 saat mendefinisikan layanan, dimungkinkan untuk menyuntikkan parameter konfigurasi dengan %parameter.name%merujuknya dengan string. Sebagai contoh:

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

Tapi apa pendekatan Drupal 8 yang benar untuk menyuntikkan nilai konfigurasi ke layanan? Tentu saja saya tidak ingin menggunakan \Drupal::config()di dalam kelas layanan. Melewati nilai konfigurasi setiap kali layanan direferensikan tidak masuk akal juga.

Saya tahu bahwa saya dapat menyuntikkan layanan konfigurasi itu sendiri dan kemudian mendapatkan nilai konfigurasi dari itu, tetapi itu terlihat sedikit jelek karena layanan saya sendiri sudah tahu cara membaca data dari layanan konfigurasi. Sebagai contoh:

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

Apakah ada cara lain untuk melakukan hal ini?.

SiliconMind
sumber
1
Pendekatan D8 adalah menggunakan @config.factorylayanan untuk mendapatkan konfigurasi dari layanan konfigurasi. Ini karena layanan konfigurasi dapat diganti dan tidak perlu mendapatkan nilai konfigurasinya dari tempat yang sama.
mradcliffe

Jawaban:

7

Anda dapat menggunakan pabrik untuk app.mailerlayanan Anda . Pabrik berhati-hati dalam mengambil konfigurasi untuk layanan. Layanan dapat tetap dipisahkan dari layanan konfigurasi dan tidak perlu tahu bagaimana parameter konfigurasi dinamai.

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
sumber
1
Saya bingung, karena saya berharap melihat 2 definisi layanan, mirip dengan contoh yang diberikan di webomelette.com/more-complex-services-using-factories-drupal-8 , Dengan contoh ini, bagaimana saya bisa menyuntikkan layanan lain ke Mailerkelas ?
Miloš Kroulík
3

Itulah cara melakukannya. Konfigurasi dapat berubah saat runtime, definisi layanan biasanya bertahan dan rebulding itu mahal. Dengan asumsi itu adalah konfigurasi yang Anda ingin pengguna ubah.

Jika tidak, maka Anda dapat menggunakan parameter, seperti contoh symfony. Kemudian Anda dapat meletakkan konfigurasi Anda di services.yml di situs / default. Tetapi Anda hanya dapat mengubahnya dengan mengubah kode dan membangun kembali wadah.

Berdir
sumber
OK, jadi ini pada dasarnya berarti suatu layanan perlu tahu bagaimana parameter konfigurasi dinamai untuk mendapatkannya dari layanan konfigurasi pabrik. Sedikit canggung dan membuat pengujian lebih rumit. Apakah ada semacam rintisan pabrik konfigurasi untuk tujuan pengujian?
SiliconMind