这可能是一个愚蠢的问题。我正在尝试为 Doctrine 2 创建一个通用存储库接口,以便可以通过直接注入将其传递到我的控制器中:
//TestController.php
public function __construct(TestRepositoryInterface $p_repository){
//...
}
Doctrine2 中 EntityRepository 的方法签名如下:
class EntityRepository implements ObjectRepository, Selectable{
//...
}
EntityRepository
缺少一些我想在存储库中拥有的功能(添加、删除、更新)。所以我创建了一个基础存储库接口和一个抽象存储库类来封装这些功能:
interface RepositoryInterface {
public function add($entity);
public function delete($entity);
public function update($entity);
}
抽象存储库类扩展自,EntityRepository
因此我仍然可以获得EntityRepository
.
abstract class AbstractRepository extends EntityRepository{
public function add($entity){
//...
}
public function add($entity){
//...
}
public function add($entity){
//...
}
}
为了将所有内容联系在一起,我TestRepositoryInterface
从RepositoryInterface
、ObjectRepository
和Selectable
.
interface TestRepositoryInterface extends RepositoryInterface, ObjectRepository, Selectable{
}
然后我可以TestRepositoryInterface
通过直接注入的实现:
class TestImplementation extends AbstractRepository implements TestRepositoryInterface{
//...
}
或者,如果我进行单元测试,创建模拟对象或测试存根会很容易。
我唯一担心的是在TestImplementation
课堂上。它扩展AbstractRepository
了已经实现ObjectRepository
和Selectable
(通过EntityRepository
),同时TestImplementation
也实现TestRepositoryInterface
了也扩展了ObjectRepository
和Selectable
。所以TestImplementation
本质上是实施ObjectRepository
和Selectable
两次(或者是吗?)。它编译得很好,但这是一种有效的方法吗?