如何在Symfony2中扩展EntityRepository?

时间:2012-02-12 12:18:31

标签: php oop symfony doctrine-orm

我遇到了这个问题我在所有存储库中都有一个重复的方法,例如这个方法。

function getAllOrderedBy($column) {

    $qb = $this->createQueryBuilder('ac')
            ->select('ac')
            ->orderBy('ac.' . $column);

    return $qb->getQuery()->getResult();
}

我想在另一个超类OrderedRepository中提取它,并将其用作所有其他存储库的基类。

现在问题是如何做到这一点?

我试图在OrderedRepository的构造函数中实例化EntityRepository, 像这样的东西,但也实例化所有内部对象,其他东西需要,但它没有真正起作用,我觉得这是错误的道路。

function __construct() {

  parent::__construct();
  $this->blabla_option = "instantiated";
}

请您举一个正确扩展EntityRepository的示例,这样扩展类可以作为其他存储库的基类吗?

P.S。我是PHP的初学者,所以如果我因为不知不觉而伤害你的感情,请原谅。

1 个答案:

答案 0 :(得分:12)

这更像是一种教义。

假设您正在为学说映射使用注释,您必须声明您在实体中使用的存储库类:

/**
 * @ORM\Entity(repositoryClass="Fully\Qualified\Namespace\To\MyRepository")
 */
class MyEntity { }

如下所述:http://symfony.com/doc/2.0/book/doctrine.html#custom-repository-classes

然后,您可以使用标准类继承来编写此自定义MyRepository类。

你可以想象这样的事情:

class OrderedRepository extends EntityRepository 
{
    //  some extra methods...
}

class MyRepository extends OrderedRespository {}

最后,如果要覆盖存储库的__constructor,来使用相同的参数初始化父构造函数:

public function __construct($em, Mapping\ClassMetadata $class)
{
    parent::__construct($em, $class);
    // some extra stuff
}