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

Php Symfony2:如何添加应用程序范围的条令自定义方法?,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我无意中发现了一条新路 OP询问他如何使用Doctrine2本机不支持的限制标准调用findAll()。公认的答案明智地建议他查看此方法的源代码,我们从中了解到,findAll()只不过是使用特定参数调用findBy() 因此,可以通过直接调用findAll()来调用限制为13的findAll(): findBy(array(), array('id' => 'DESC'), 13); 但在阅读代码时,最后一条指令并不像下面这样的调用那样简单: findAllWithLimit(13);

我无意中发现了一条新路

OP询问他如何使用Doctrine2本机不支持的
限制
标准调用
findAll()
。公认的答案明智地建议他查看此方法的源代码,我们从中了解到,
findAll()
只不过是使用特定参数调用
findBy()

因此,可以通过直接调用
findAll()
来调用
限制为13的
findAll()

findBy(array(), array('id' => 'DESC'), 13);
但在阅读代码时,最后一条指令并不像下面这样的调用那样简单:

findAllWithLimit(13);
我的问题是:如果我想让这个方法应用广泛,它应该属于哪里?

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

第一个解决方案(灵活性较低/超级简单)

您需要覆盖config.yml中的默认存储库类,并创建自己的存储库类

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

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中的更多条令选项,请查看

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

您可以创建自己的存储库,并让它扩展自己的基本存储库类

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

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
类。我给你的文档应该教你怎么做

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


希望有帮助

谢谢!你的回答非常有用。