【发布时间】:2014-05-21 11:13:43
【问题描述】:
你好堆栈溢出者,
使用 Doctrine 2,我在自定义存储库和继承方面遇到了一些麻烦。
长话短说,我想做那种结构:
- BaseEntityRepository : 包含基于被调用类名的泛型方法,例如 findByXXX()
- SomeEntityRepository : 包含与实体类型相关的具体方法
这些类的代码如下所示:
BaseEntityRepository:
namespace model\repositories;
use \Doctrine\ORM\EntityRepository;
class BaseEntityRepository extends EntityRepository {
public function findByID($id) {
$result = null;
try {
$dql = "SELECT a FROM " . get_called_class() . " a WHERE a.id = :id";
$query = $this->_em->createQuery($dql);
$query->setParameter("id", $id);
$result = $query->getSingleResult();
} catch (\Exception $ex) {
echo $ex->getMessage();
}
return $result;
}
}
SomeEntityRepository:
namespace model\repositories;
class SomeEntityRepository extends BaseEntityRepository {
}
我的测试示例代码:
$repo = $em->getRepository("model\\entities\\SomeEntity");
$result = $repo->findByID($id);
有了这段代码,我希望$repo 可以通过继承BaseEntityRepository 来访问findByID($id) 方法。当然,SomeEntity 的 repositoryClass 注释针对 SomeEntityRepository。相反,BaseEntityRepository 不是作为独立存储库类的目标。
问题是,我得到的只是一个例外:
Class "model\repositories\SomeEntityRepository" 的子类 “model\repositories\BaseEntityRepository”不是有效实体或 映射超类。
看在我的份上,我无法弄清楚这段代码有什么问题。也许我错过了一些东西,但我对存储库中继承的研究并没有带来任何令人满意的结果。我想对存储库有某种限制,例如为了使它们正常工作,所有这些都应该至少作为 repositoryClass 一次或类似的目标,但这并不让我满意。
如果您有任何见解、建议或解决方案,我会全力以赴!再次感谢。
【问题讨论】:
-
从使用 \Doctrine 中删除前导反斜杠...我怀疑您的问题实际上出在您的 dql 查询中。追踪它。
-
删除反斜杠不会改变任何东西。但是,正如您所怀疑的,问题确实来自查询。我使用
get_called_class()来实际获取实体名称,但我实现结构的方式永远不会发生。我会以另一种方式思考,但问题确实来自 DQL 查询。没想到是从那里来的。我可以要求您将您的评论更改为答案,以便我实际上可以选择它是正确的吗?非常感谢。
标签: php inheritance doctrine-orm repository customization