Symfony2:如何添加应用程序范围的Doctrine自定义方法?

时间:2014-02-01 15:23:01

标签: php symfony doctrine-orm

我偶然发现了interesting question about Doctrine's findAll() method

OP询问他如何用findAll()标准调用limit,而Doctrine2本身不支持这些标准。接受的答案明智地建议他查看这个方法的源代码,我们从中了解到findAll()只是用特定的参数调用findBy()

通过直接致电,可以通过findAll() 13来调用limit

findBy(array(), array('id' => 'DESC'), 13);

但是在阅读代码时,最后一条指令并不像看起来像这样的调用那么简单:

findAllWithLimit(13);

我的问题是:如果我想在整个应用程序范围内使用此方法属于哪种方式?

public function findAllWithLimit($limit)
{
    return $em->findBy(array(), array('id' => 'DESC', $limit);
}

1 个答案:

答案 0 :(得分:1)

第一种解决方案(不太灵活/超级简单)

您需要覆盖config.yml中的默认Repository类并自行创建。

让我们创建您自己的基本存储库类:

namespace My\BaseBundle\Repository; // you will want to change

use Doctrine\ORM\EntityRepository as BaseEntityRepository;

class EntityRepository extends BaseEntityRepository
{
    public function findAllWithLimit($limit) {
        // your logic
    }
}

然后在config.yml文件中,您将定义实体管理器的默认实体存储库。

doctrine:
    orm:
        entity_managers:
            default: # you will have to figure out what the value is in your config.yml file
                default_repository_class: My\BaseBundle\Repository\EntityRepository # make sure to put the proper namespace

有关Symfony中的更多Doctrine选项,请查看configuration reference here

第二种解决方案(最灵活/最长的)

您可以创建自己的custom repository class并让它扩展您自己的基础存储库类。

例如,您自己的基础存储库类将是:

namespace My\BaseBundle\Repository;

use Doctrine\ORM\EntityRepository as BaseEntityRepository;

class EntityRepository extends BaseEntityRepository
{
    public function findAllWithLimit($limit) {
        // your logic
    }
}

虽然每个存储库类看起来像:

namespace My\AwesomeBundle\Repository;

use My\BaseBundle\Repository\EntityRepository;

class DogRepository extends EntityRepository
{

}

然后定义Dog实体,使其指向DogRepository类。我给你的文件应该教你如何做。

此解决方案需要更多代码,但使代码更清晰,因为它允许将存储库调用拆分为方法。

希望它有所帮助!