Symfony 在没有基本存储库的多个实体存储库中具有相同的功能?

Symfony 在没有基本存储库的多个实体存储库中具有相同的功能?,symfony,doctrine-orm,Symfony,Doctrine Orm,假设我在条令中有一组实体,每个实体有一个自定义存储库 对于这些实体中的许多实体,我有一个扩展链,比如MyEntity扩展GenericEntity扩展StandardEntity扩展BaseEntity,存储库也遵循相同的方法 在我的例子中,这是完全有效的,因为根据OOP,MyEntity只是公共基类的一个非常特定的版本 现在我有了一个存储库功能,如下所示: public function getCount() { $qb = $this->_em->createQu

假设我在条令中有一组实体,每个实体有一个自定义存储库

对于这些实体中的许多实体,我有一个扩展链,比如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();

}
多个实体拥有相同的功能将是非常好的,我不想避免代码重复

我的理解:

  • 接口ICoundableRepository:只有部分帮助,因为我需要在类中实现
  • 扩展CountEntityRepository:不适合我的扩展链,PHP中也不可能有多重继承
  • 特质可数存储库:
  • 这对我来说似乎是最有用的方法。但是,是否有可能并建议采用以下方式:

        public function getCount()
        {
        $qb = $this->_em->createQueryBuilder();
        $qb->select('COUNT(me)');
        $qb->from($this->_entityName, 'me');
    
        return $qb->getQuery()->getSingleScalarResult();
    
        }
    
    “这”在一个特质中可能吗


    或者,还有什么方法可以构建可以“注入”到某些选定存储库中的通用存储库功能?

    对于这样的东西,trait是完全合适的。 但您也可以扩展基本存储库。我真的不明白为什么这不可能。我认为你应该能够做到这一点:

    <?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();
        }
    }
    

    一个特性就可以了。KNP实验室在他们的博士行为包中使用它。()谢谢,我同意——显然我的问题不太清楚。当然,这种方法在这里是有效的,但是如果MyEntityA从GenericA/StandardA扩展而MyEntityB从GenericB扩展而来呢。如果没有公共根元素。但你已经帮了我一把了!非常感谢@您的实体类彼此不扩展并不意味着您不能使用相同的基本存储库类。但是一个特征可能更好。。。
    
    <?php
    namespace Application\Repository;
    
    class StandardEntityRepository extends BaseEntityRepository
    {
    
    }
    
    <?php
    namespace Application\Repository;
    
    class GenericEntityRepository extends StandardEntityRepository
    {
    
    }
    
    <?php
    namespace Application\Repository;
    
    class MyEntity extends GenericEntityRepository
    {
    
    }