сервисы маркировки symfony 3 для использования в сервисе автопроводки - PullRequest
0 голосов
/ 14 декабря 2018

Я попытался создать интерфейс для создания служб с тегами, которые можно внедрить в другой сервис, основываясь на документации здесь https://symfony.com/doc/3.4/service_container/tags.html

Я создал интерфейс, подобный

namespace AppBundle\Model;


interface PurgeInterface {
  //put your code here
  public function purge ();
}

, поместивопределение в service.yml:

_instanceof:
    AppBundle\Model\PurgeInterface:
        tags: ['app.purge']

и создание сервисов на этом интерфейсе.Отладка консоли: контейнер показывает мои службы как правильно помеченные.

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

services.yml:

    purge_manager:
        class: AppBundle\Service\PurgeManager
        arguments: [!tagged app.purge]

Служба выглядит следующим образом:

namespace AppBundle\Service;

use AppBundle\Model\PurgeInterface;

class PurgeManager {

  public function __construct(iterable $purgers) {
    dump($purgers);
  }
}

Если я проверю это, я получу:

Type error: Too few arguments to function AppBundle\Service\PurgeManager::__construct(), 0 passed in /.....Controller.php on line 21 and exactly 1 expected

Я не пытался создать пропуск компилятора, потому что я просто хочу понять, почемуэто не работает, как следует на основании документации

Заранее спасибо

Себастьян

1 Ответ

0 голосов
/ 14 декабря 2018

Вы можете использовать теги, ручное определение сервиса и _instanceof в конфигурации.Это один из способов Symfony, но он требует много YAML-кодирования.Какие есть другие варианты?

Использовать автопроводной массив

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

Самый простой подход состоит в том, чтобы автоматически связывать аргументы с помощью массива с автосвязью .

  • без тега
  • поддержка автоматического обнаружения PSR-4
  • нет кодирования вне службы
  • 1 проход компилятора

Пример

namespace AppBundle\Service;

use AppBundle\Model\PurgeInterface;

class PurgeManager
{
    /**
     * @param PurgeInterface[] $purgers
     */
    public function __construct(iterable $purgers) {
        dump($purgers);
    }
}

Это также называется шаблон коллектора .

Как интегрировать


Если есть несовместимые классы, исключите их в конструкторе прохода компилятора:

$this->addCompilerPass(new AutowireArrayParameterCompilerPass([
    'Sonata\CoreBundle\Model\Adapter\AdapterInterface'
]);
...