【问题标题】:Symfony setup dependency injection from extended class来自扩展类的 Symfony 设置依赖注入
【发布时间】:2018-06-09 11:13:05
【问题描述】:

我想像这样注入抽象类:

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?
  • Symfony 4,很抱歉忘记指定

标签: php symfony dependency-injection doctrine


【解决方案1】:

你试过这个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

【讨论】:

    【解决方案2】:

    按照音符指示

    如果您的文件中有 _defaults 部分,则所有子服务都是 需要显式覆盖这些值以避免歧义。你 将看到关于此的明确错误消息。

    @brucie-alpha 链接参考,我可以管理与父服务的公共依赖关系。这是对我有用的解决方案,因为我在 services.yaml 文件中使用 _defaults 部分

    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
    

    【讨论】:

      猜你喜欢
      • 2016-06-22
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-15
      • 1970-01-01
      相关资源
      最近更新 更多