几个没有Base Repository的实体存储库中的相同功能?

时间:2015-11-06 17:59:05

标签: symfony doctrine-orm

假设我在Doctrine中有一组实体,每个实体都有一个自定义存储库。

对于许多这些实体,我有一系列扩展,让我们说MyEntity扩展GenericEntity扩展StandardEntity扩展BaseEntity和存储库遵循相同的方法。

在我的情况下,这是完全有效的,因为根据OOP,MyEntity只是公共基类的一个非常具体的版本。

现在我有一个像这样的存储库函数:

    public function getCount()
{
    $qb = $this->_em->createQueryBuilder();
    $qb->select('COUNT(me)');
    $qb->from('MyEntity', 'me');

    return $qb->getQuery()->getSingleScalarResult();

}

为多个实体提供相同的功能会很棒,我不会避免代码重复。

我理解的选择:

  1. 接口 iCountableRepository:因为我需要在课堂上实施,所以只是部分有用。
  2. 扩展 CountEntityRepository:不适合我的扩展链,在PHP中也不可能实现多重继承
  3. Trait CountableRepository:
  4. 这听起来对我来说是最有用的方法。但是有可能并且建议有类似的东西:

        public function getCount()
        {
        $qb = $this->_em->createQueryBuilder();
        $qb->select('COUNT(me)');
        $qb->from($this->_entityName, 'me');
    
        return $qb->getQuery()->getSingleScalarResult();
    
        }
    

    这是'这个'特质可能吗?

    或者可能是构建通用存储库功能的另一种方法,可以注入'进入一些选定的存储库?

1 个答案:

答案 0 :(得分:2)

对于这样的事情来说,特质是完全正常的。 但您也可以扩展基础存储库。我真的不明白为什么这是不可能的。我认为你应该能够做到这一点:

<?php
namespace Application\Repository;

use Countable;

class BaseEntityRepository extends EntityRepository implements Countable
{
    /**
     * Count items in this repository
     *
     * @return int
     */
    public function count()
    {
        $qb = $this->createQueryBuilder('b');
        $qb->select('COUNT(b)');
        return $qb->getQuery()->getSingleScalarResult();
    }
}

然后:

<?php
namespace Application\Repository;

class StandardEntityRepository extends BaseEntityRepository
{

}

然后:

<?php
namespace Application\Repository;

class GenericEntityRepository extends StandardEntityRepository
{

}

<?php
namespace Application\Repository;

class MyEntity extends GenericEntityRepository
{

}