Làm thế nào để tiêm giá trị cấu hình vào dịch vụ?


8

Trong Symfony 2 khi xác định dịch vụ, có thể đưa các tham số cấu hình bằng cách tham chiếu chúng với các %parameter.name%chuỗi. Ví dụ:

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

Nhưng cách tiếp cận Drupal 8 chính xác để tiêm các giá trị cấu hình vào các dịch vụ là gì? Tất nhiên tôi không muốn sử dụng \Drupal::config()bên trong một lớp dịch vụ. Truyền các giá trị cấu hình mỗi khi một dịch vụ được tham chiếu cũng không có ý nghĩa nhiều.

Tôi biết rằng tôi có thể tự tiêm dịch vụ cấu hình và sau đó nhận các giá trị cấu hình từ nó, nhưng điều đó có vẻ hơi nhảm nhí vì bản thân dịch vụ của tôi đã biết cách đọc dữ liệu từ dịch vụ cấu hình. Ví dụ:

# 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ó cách nào khác để làm điều này?


1
Cách tiếp cận D8 là sử dụng @config.factorydịch vụ để lấy cấu hình từ dịch vụ cấu hình. Điều này là do dịch vụ cấu hình có thể bị ghi đè và không nhất thiết phải nhận các giá trị cấu hình từ cùng một nơi.
mradcliffe

Câu trả lời:


7

Bạn có thể sử dụng một nhà máy cho app.mailerdịch vụ của bạn . Nhà máy quan tâm đến việc lấy cấu hình cho dịch vụ. Dịch vụ có thể tách rời khỏi dịch vụ cấu hình và không cần biết các tham số cấu hình được đặt tên như thế nào.

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
Tôi bối rối, vì tôi dự kiến ​​sẽ thấy 2 định nghĩa dịch vụ, tương tự như các ví dụ được đưa ra trong webomelette.com/more-complex-service-USE-factories-drupal-8 , Đưa ra ví dụ này, làm cách nào tôi có thể tiêm dịch vụ khác vào Mailerlớp ?
Miloš Kroulík

3

Đó là một cách làm việc đó. Cấu hình có thể thay đổi khi chạy, định nghĩa dịch vụ thường được duy trì và sắp xếp lại nó rất tốn kém. Giả sử đó là cấu hình mà bạn muốn người dùng thay đổi.

Nếu không, thì bạn có thể sử dụng các tham số, giống như ví dụ về symfony. Sau đó, bạn có thể đặt cấu hình của mình trong services.yml trong trang web / mặc định. Nhưng bạn chỉ có thể thay đổi nó bằng cách thay đổi mã và xây dựng lại container.


OK, vì vậy, điều này về cơ bản có nghĩa là một dịch vụ cần biết cách đặt tên các tham số cấu hình để có được chúng từ dịch vụ cấu hình nhà máy. Một chút lúng túng và làm cho thử nghiệm phức tạp hơn. Có một số loại sơ khai nhà máy cấu hình cho mục đích thử nghiệm?
SiliconMind

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.