学说2:自定义存储库和继承

时间:2014-05-21 11:13:44

标签: php inheritance doctrine-orm repository customization

Hello Stack Overflowers,

使用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可以通过继承findByID($id)来访问BaseEntityRepository方法。当然,repositoryClass目标的SomeEntity注释SomeEntityRepository。相反,BaseEntityRepository不是作为独立的存储库类的目标。

问题是,我得到的只是一个例外:

  

Class" model \ repositories \ SomeEntityRepository"子类   "模型\库\ BaseEntityRepository"不是有效的实体或   映射超类。

我不能为了我而弄清楚这段代码中的错误。也许我错过了一些东西,但我对存储库中继承的研究没有带来任何令人满意的结果。我想对存储库有一些限制,例如为了让它们正常工作,所有应该至少作为repositoryClass一次或类似的目标,但这并不让我高兴。

如果你有任何见解,建议或解决方案,我全都耳朵!再次感谢。

1 个答案:

答案 0 :(得分:1)

问题在于get_called_class,它不会做你想要的。

使用doctrine查询构建器。这消除了了解特定实体类的需要。

搜索:使用Doctrine的查询生成器查询对象

http://symfony.com/doc/current/book/doctrine.html