小编Sam*_*igh的帖子

Symfony - 如何访问实体的存储库

我们可以通过多种方式访问​​Symfony2控制器或服务中的实体存储库,这些控制器或服务各有优缺点.首先我在这里列出它们然后询问是否有更好的解决方案或者这些是我们唯一的选择,我们应该根据我们的偏好选择一个或一些.我还想知道方法5(我最近开始使用它)是否良好并且不会违反任何规则或有任何副作用.

基本方法:在控制器中使用实体管理器或将其注入服务,然后访问我想要的任何存储库.这是在控制器或服务中访问存储库的基本方法.

class DummyController
{
    public function dummyAction($id)
    {
        $em = $this->getDoctrine()->getManager();
        $em->getRepository('ProductBundle:Product')->loadProduct($id);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是这个方法存在一些问题.第一个问题是我无法按Ctrl +单击例如loadProduct函数并直接执行它的实现(除非有一种我不知道的方法).另一个问题是我将一遍又一遍地重复这部分代码.

方法2:另一种方法是在我的服务或控制器中定义一个getter来访问我的存储库.

class DummyService
{
    protected $em;

    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    } 

    public function dummyFunction($id)
    {
        $this->getProductRepository()->loadProduct($id);
    }

    /**
     * @return \ProductBundle\Entity\Repository\ProductRepository
     */
    public function getProductRepository()
    {
        return $this->em->getRepository('ProductBundle:Product');
    }
}
Run Code Online (Sandbox Code Playgroud)

这个方法解决了第一个问题,不知怎的,第二个问题,但我仍然必须在我的服务或控制器中重复我需要的所有getter,我也会在我的服务和控制器中有几个getter只是为了访问存储库

方法3:另一种方法是为我的服务注入一个存储库,特别是如果我们对我们的代码有一个很好的控制并且我们没有参与将整个Container注入您的服务的其他开发人员,这是很好的.

class DummyService
{
    protected $productRepository;

    public function __construct(ProductRepository $productRepository)
    {
        $this->productRepository = $productRepository;
    } 

    public function dummyFunction($id)
    {
        $this->productRepository->loadProduct($id);
    }
}
Run Code Online (Sandbox Code Playgroud)

这个方法解决了第一个和第二个问题,但如果我的服务很大并且它需要处理很多存储库,那么向我的服务注入例如10个存储库并不是一个好主意.

方法4:另一种方法是使用服务来包装我的所有存储库并将此服务注入其他服务. …

doctrine design-patterns symfony doctrine-orm symfony-2.3

11
推荐指数
2
解决办法
2万
查看次数