【发布时间】:2013-11-23 19:51:44
【问题描述】:
这可能是一个愚蠢的问题。我正在尝试为 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(或者是吗?)。它编译得很好,但这是一种有效的方法吗?
【问题讨论】:
标签: php oop unit-testing doctrine-orm