Symfony 2:如何减少这段代码?

时间:2014-11-14 00:23:37

标签: php symfony doctrine

在完成CRUD时,我经常重复这些内容:

// ../myBundle/Controller/MyController.php
$entityManager = $this->getDoctrine()->getManager();
$repository    = $entityManager->getRepository('myBundle:myEntity');

我的想法是在$entityManager中定义$repository__construct(),但据我所知,I'd have to define a service for my class。这感觉很夸张。

如何以有用的方式减少代码?

提前致谢

1 个答案:

答案 0 :(得分:2)

实际上,只有在您持久保存实体时才需要经理。如果你的控制器的这个动作只需要获取它们,那么你可以:

  • 仅检索存储库,例如$this->getDoctrine()->getRepository(...)
  • 将存储库本身包装到服务中,因此可以通过$this->container->get('my_bundle.my_entity.repository')
  • 访问它

根据您的使用情况,您可以使用更适合的方法。

但是,在意识形态上,所有提取逻辑都应该在您的存储库中实现,因此您永远不必将存储库放入本地变量中。您应该能够$this->getDoctrine()->getRepository('MyBundle:MyEntity')->findBySomething($args...)$args是您的标准。

如果要从控制器中分解出所有持久性逻辑,那么管理者就是这样。基本上,您实现了一个处理持久性和提取的类,可能会委托给它的依赖项。看一下FOSUserBundle's UserManager来了解这个想法。这种模式的用例看起来非常像这样:

<?php

class CatsController extends Controller 
{
    public function list()
    {
        return $this->get('my_bundle.cats_manager')->findAll();
    }

    public function get($name)
    {
        return $this->get('my_bundle.cats_manager')->findOneByName($name);
    }

    public function create(Request $request)
    {
        $cat = new Cat(
            'Micky',
            'siamese'
        );

        $this->get('my_bundle.cats_manager')->persist($cat);
    }

    // ...
}