Внедрение зависимостей настройки Symfony из расширенного класса

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

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

Какую версию Symfony вы используете?

hanish singla 09.06.2018 15:01

Symfony 4, извините, что забыл указать

jj-aa 09.06.2018 18:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
779
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

вы пробовали этот 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
Ответ принят как подходящий

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

If you have a _defaults section in your file, all child services are required to explicitly override those values to avoid ambiguity. You will see a clear error message about this.

ссылки @ 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

Другие вопросы по теме