【问题标题】:How to extend EntityRepository in Symfony2?如何在 Symfony2 中扩展 EntityRepository?
【发布时间】:2012-02-12 12:18:31
【问题描述】:

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

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 的示例,以便这个扩展类可以用作其他存储库的基类?

附:我是 PHP 初学者,如果我的不知情伤害了您的感受,请原谅。

【问题讨论】:

    标签: php oop symfony doctrine-orm


    【解决方案1】:

    这更像是 Doctrine2 的事情。

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

    /**
     * @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
    }
    

    【讨论】:

    • 可捕获的致命错误:传递给 OrderedRepository::__construct() 的参数 2 必须是 Metadata\ClassMetadata 的实例,给定的 Doctrine\ORM\Mapping\ClassMetadata 的实例,在 ...vendor\doctrine 中调用\lib\Doctrine\ORM\EntityManager.php 在第 578 行并在 OrderedRepository.php 第 18 行第 18 行中定义:公共函数 __construct($em, ClassMetadata $class)
    • 您必须在类的顶部添加相应的 use 语句,或者对完全限定的命名空间进行类型提示。示例:公共函数 __construct($em, Doctrine\ORM\Mapping\ClassMetadata $class)
    • 是的,谢谢,它成功了,虽然现在我需要在每个存储库中实现构造函数,这与最初的目标有冲突:(
    • 我不建议你重写构造函数。你没有其他解决方案吗?你打算在构造函数中做什么?
    • 在这个具体案例中,我想设置将在 OrderedRepository 中用于创建查询的父 $entityAlias。但我认为可能有一个更合理的原因,可能在这一点上我还没有达到它。
    猜你喜欢
    • 1970-01-01
    • 2021-10-12
    • 2012-02-19
    • 1970-01-01
    • 2023-03-23
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多