Symfony AutoWire несколько сервисов одного класса - PullRequest
0 голосов
/ 30 ноября 2018

Я нахожусь в процессе обновления большого приложения до 4.2

, а $this->get(".....") изнутри контроллера устарел, и вместо него следует использовать AutoWire.

Я работаю впроблема в том, что у меня есть 2 службы, которые на самом деле принадлежат к одному и тому же классу (просто аргументы diffrent-конструктора).

services.yml

services:
  service.a:
    class: Namespace\MyClass
    arguments: [ "argument1" ]

  service.b:
    class: Namespace\MyClass
    arguments: [ "argument2" ]

контроллер:

public function demoAction() {
  $serviceA = $this->get("service.a");
  $serviceB = $this->get("service.b");
}

и проблемный результат:

public function demoAction(MyClass $serviceA, MyClass $serviceB) {
}

мы можем использовать псевдоним для определения сервисов, таких как:

MyClass: '@service.a'

, но я не могу использовать виртуальный / поддельный класс, например (без существующего):

MyPseudClass: '@service.b'

как вы обрабатываете подобные случаи в автоматическом режиме?

я мог бы создавать "псевдо" классы, которые расширяются от базы, просто чтобы получить разные имена классов, но это странно.

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Вы по-прежнему можете использовать "@servicename" в файлах service.yml и соединять их по имени / вот пример, где у меня есть несколько различных регистраторов, подключаемых к конструктору службы.

# App/Subscribers/WebhookLoggingListener.php file
public function __construct(
    LoggerInterface $logger, 
    LoggerInterface $mailgunLog
{ }

# services.yml
App\Subscribers\WebhookLoggingListener:
    arguments:
        $logger: "@logger"
        $mailgunLog: "@monolog.logger.mailgun"
    tags:
       - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest

Вы также можете привязать их к именам переменных (в services: _defaults: в заголовке файла services.yaml, но если они не будут использоваться повторно, я считаю, что лучше сохранить конфигурацию более локализованной).

0 голосов
/ 30 ноября 2018

Еще одним вариантом является реализация Factory Pattern .Этот шаблон позволит вам создать сервис на основе предоставленных аргументов.

# services.yml
service.a:
    class: App\MyClass
    factory: 'App\Factory\StaticMyClassFactory:createMyClass'
    arguments:
        - ['argument1']

service.b:
    class: App\MyClass
    factory: 'App\Factory\StaticMyClassFactory:createMyClass'
    arguments:
        - ['argument2']

И ваш StaticMyClassFactory будет выглядеть следующим образом

class StaticMyClassFactory
{  
    public static function createMyClass($argument)
    {
        // Return your class based on the argument passed
        $myClass = new MyClass($argument);

        return $myClass;
    }
}
0 голосов
/ 30 ноября 2018

Начиная с 4.2, вы можете определять именованные псевдонимы автопроводки.Это должно работать:

services:
    Namespace\MyClass $serviceA: '@service.a'
    Namespace\MyClass $serviceB: '@service.b'

В Symfony 3.4 и 4.1 вы можете вместо этого использовать привязки - но это менее конкретно, поскольку не учитывает тип:

services:
    _defaults:
        bind:
            $serviceA: '@service.a'
            $serviceB: '@service.b'
...