如何在Symfony 4中创建通用存储库

时间:2018-12-12 16:45:53

标签: php doctrine-orm symfony4

我正在使用Symfony 4,我有很多具有共同行为的存储库,所以我想避免重复代码。我试图通过这种方式定义父存储库类:

  AVAudioSession.sharedInstance().setActive(true)
  AVAudioSession.sharedInstance().observe(\.outputVolume) { [weak self] (audioSession, _) in
        <#code#>
    }

因此,我将能够定义其子类,例如:

<?php
namespace App\Repository;

use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Symfony\Bridge\Doctrine\RegistryInterface;

class AppRepository extends ServiceEntityRepository {
    public function __construct(RegistryInterface $registry, $entityClass) {
        parent::__construct($registry, $entityClass);
    }

    // Common behaviour
}

但是我遇到了这个错误:

  

无法自动装配服务“ App \ Repository \ AppRepository”:参数   方法“ __construct()”的“ $ entityClass”必须具有类型提示或   明确给出一个值。

我尝试设置<?php namespace App\Repository; use App\Entity\Test; use App\Repository\AppRepository; use Symfony\Bridge\Doctrine\RegistryInterface; class TestRepository extends AppRepository { public function __construct(RegistryInterface $registry) { parent::__construct($registry, Test::class); } } string之类的类型提示,但没有用。

是否可以定义通用存储库?

预先感谢

2 个答案:

答案 0 :(得分:5)

autowire的“陷阱”之一是默认情况下,autowire会在src下查找所有类,并尝试将它们变为服务。在某些情况下,它最终会拾取诸如AppRepository之类的类,这些类不打算用作服务,然后在尝试自动装配它们时失败。

最常见的解决方案是显式排除这些类:

# config/services.yaml
App\:
    resource: '../src/*'
    exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php,Repository/AppRepository.php}'

另一种可行的方法(未经测试)是使AppRepository抽象。 Autowire将忽略抽象类。存储库有些棘手,让抽象类扩展非抽象类有点不寻常。

答案 1 :(得分:1)

只需将您的AppRepository设为摘要

abstract class AppRepository {}