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



我使用Symfony 4,我有很多具有常见行为的存储库,所以我想避免重复代码。我试图用这种方式定义一个父存储库类:

<?php
namespace AppRepository;
use DoctrineBundleDoctrineBundleRepositoryServiceEntityRepository;
use SymfonyBridgeDoctrineRegistryInterface;
class AppRepository extends ServiceEntityRepository {
public function __construct(RegistryInterface $registry, $entityClass) {
parent::__construct($registry, $entityClass);
}
// Common behaviour
}

所以我可以定义它的子类,例如:

<?php
namespace AppRepository;
use AppEntityTest;
use AppRepositoryAppRepository;
use SymfonyBridgeDoctrineRegistryInterface;
class TestRepository extends AppRepository {
public function __construct(RegistryInterface $registry) {
parent::__construct($registry, Test::class);
}
}

但我得到了这个错误:

无法自动连接服务"App\Repository\AppRepository":参数方法"__construct(("的"$entityClass"必须具有类型提示或明确给定一个值。

我尝试设置类型提示,如stringobject,但没有成功。

是否有定义通用存储库的方法?

提前感谢

autowire的"gotchas"之一是,默认情况下,autowire会在src下查找所有类,并尝试将它们变成服务。在某些情况下,它最终会拾取不打算作为服务的类,如AppRepository,然后在尝试自动连接它们时失败。

最常见的解决方案是明确排除这些类:

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

另一种应该有效(而不是经过测试(的方法是使AppRepository抽象化。Autowire将忽略抽象类。存储库有点棘手,让抽象类扩展非抽象类有些不寻常。

只需使您的AppRepository抽象即可,例如

abstract class AppRepository {}

相关内容

  • 没有找到相关文章

最新更新