Установка зависимости Symfony от расширенного класса - PullRequest
0 голосов
/ 09 июня 2018

Я хотел бы внедрить абстрактный класс следующим образом:

services:
    App\Infrastructure\Persistence\BaseDoctrineRepository:
        arguments:
          $eventStore: '@broadway.event_store'
          $registry: '@doctrine'
          $eventBus: '@broadway.event_handling.event_bus'

, но если это сделать, я получу:

Cannot autowire service "App\Infrastructure\Persistence\User\DoctrineUserRepository": argument "$eventStore" of method "__construct()" references interface "Broadway\EventStore\EventStore" but no such service exists. You should maybe alias this interface to one of these existing services: "broadway.event_store.dbal", "broadway.event_store.in_memory". 

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

services:
    App\Infrastructure\Persistence\User\DoctrineUserRepository:
        arguments:
          $eventStore: '@broadway.event_store'
          $registry: '@doctrine'
          $eventBus: '@broadway.event_handling.event_bus'

Абстрактный класс:

use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;

abstract class BaseDoctrineRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry, EventStore $eventStore, EventBus $eventBus)
    {
        $this->eventStore = $eventStore;
        $this->eventBus = $eventBus;
        parent::__construct($registry, static::REPOSITORY_CLASS);
    }

Класс, который расширяется от абастрака (я бы хотел избежать конструктора):

class DoctrineUserRepository extends BaseDoctrineRepository implements UserRepository
{
    const REPOSITORY_CLASS = User::class;

    public function __construct(ManagerRegistry $registry, EventStore $eventStore, EventBus $eventBus)
    {
        parent::__construct($registry, $eventStore, $eventBus);
    }

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

После указания примечания

Если в вашем файле есть раздел _defaults, все дочерние службы должны явно переопределять эти значения, чтобы избежать неоднозначности.Вы увидите четкое сообщение об ошибке.

из ссылки @ brucie-alpha, я могу управлять общими зависимостями с родительскими службами.Вот решение, которое работает для меня, так как я использую раздел _defaults в моем файле services.yaml

App\Infrastructure\Persistence\BaseDoctrineRepository:
    abstract: true
    public: false
    autowire: false
    autoconfigure: false
    arguments:
      $eventStore: '@broadway.event_store'
      $registry: '@doctrine'
      $eventBus: '@broadway.event_handling.event_bus'

App\Infrastructure\Persistence\User\DoctrineUserRepository:
    parent: 'App\Infrastructure\Persistence\BaseDoctrineRepository'
    public: true
    autowire: false
    autoconfigure: false
0 голосов
/ 09 июня 2018

вы пробовали это https://symfony.com/doc/current/service_container/parent_services.html?

так в основном

services:
    App\Infrastructure\Persistence\BaseDoctrineRepository:
            abstract: true
            arguments:
              $eventStore: '@broadway.event_store'
              $registry: '@doctrine'
              $eventBus: '@broadway.event_handling.event_bus'
    App\Infrastructure\Persistence\User\DoctrineUserRepository:
        parent: App\Infrastructure\Persistence\BaseDoctrineRepository
...