我正在使用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
之类的类型提示,但没有用。
是否可以定义通用存储库?
预先感谢
答案 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 {}