假设我在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();
}
为多个实体提供相同的功能会很棒,我不会避免代码重复。
我理解的选择:
这听起来对我来说是最有用的方法。但是有可能并且建议有类似的东西:
public function getCount()
{
$qb = $this->_em->createQueryBuilder();
$qb->select('COUNT(me)');
$qb->from($this->_entityName, 'me');
return $qb->getQuery()->getSingleScalarResult();
}
这是'这个'特质可能吗?
或者可能是构建通用存储库功能的另一种方法,可以注入'进入一些选定的存储库?
答案 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
{
}