在完成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
。这感觉很夸张。
如何以有用的方式减少代码?
提前致谢
乙
答案 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);
}
// ...
}