Symfony2保持干燥的最佳实践
我是Symfony2的新手。我必须为我的新工作学习它,这周一开始。在那之前,我用了很多CodeIgniter。。。所以这有点变化 在阅读了大量的文档、教程和最佳实践之后。。。创建我自己的内部网以测试客户有网站、网站有访问权限、访问权限有网站、网站有类别、访问权限有访问权限类别我还有一些问题 第一个问题: 当你有一个带有前端和后端的网站时,你总是有一些重复的动作,比如: -创建新实体 -读取实体 -更新实体 -删除实体 在CI中,我创建了一个BaseController和一个BaseModel,通过一些扩展,我还可以 对于Symfony 2,这种做法仍然可以,或者Symfony是否有其他方法来处理这种情况 像AppBundle\Controller\BaseController扩展的AppBundle\Controller\AdminController和FrontController扩展的AppBundle\Controller\MyEntityController 因为实际上,每次,在每个控制器中,我都有相同的代码。例如,当我编辑一个实体时,它的过程是相同的:按id加载实体,如果没有实体则抛出异常,创建并添加表单,处理请求帖子并使表单有效,重新删除或显示视图。。。但是我总是剪切/粘贴相同的代码。。。令人敬畏的 所以我在寻找处理这个问题的最佳方法 **第二个问题:** 与医生经理合作的最佳方式是什么 每次在我的行动中,我都必须这样称呼它吗$em=$this->get。。。或者,我可以创建类似MyEntityManager的东西,称为EntityManager和实体的存储库吗 事实上,我就是这么做的: 我使用loadAndFlush创建了一个抽象AppBundle\Manager\BaseManagerSymfony2保持干燥的最佳实践,symfony,doctrine-orm,coding-style,dry,Symfony,Doctrine Orm,Coding Style,Dry,我是Symfony2的新手。我必须为我的新工作学习它,这周一开始。在那之前,我用了很多CodeIgniter。。。所以这有点变化 在阅读了大量的文档、教程和最佳实践之后。。。创建我自己的内部网以测试客户有网站、网站有访问权限、访问权限有网站、网站有类别、访问权限有访问权限类别我还有一些问题 第一个问题: 当你有一个带有前端和后端的网站时,你总是有一些重复的动作,比如: -创建新实体 -读取实体 -更新实体 -删除实体 在CI中,我创建了一个BaseController和一个BaseModel,
<?php
namespace AppBundle\Manager;
abstract class BaseManager
{
protected function persistAndFlush($entity)
{
$this->em->persist($entity);
$this->em->flush();
}
然后我使用控制器中的服务:
/**
* @Route("/edit/{customerId}", name="customer_edit")
* @Security("has_role('ROLE_ADMIN')")
*/
public function editAction($customerId, Request $request)
{
if (!$customer = $this->get('app.customer_manager')->loadCustomer($customerId)) {
throw new NotFoundHttpException($this->get('translator')->trans('This customer does not exist.'));
}
$form = $this->get('form.factory')->create(new CustomerType(), $customer);
if($form->handleRequest($request)->isValid()) {
$this->get('app.customer_manager')->saveCustomer($customer);
$request->getSession()->getFlashBag()->add('notice', 'Client bien enregistré.');
return $this->redirect(
$this->generateUrl(
'customer_show', array(
'customerId' => $customer->getId()
)
)
);
}
return $this->render('default/customer/add.html.twig', array(
'form' => $form->createView(),
'customer' => $customer
));
}
这是一个很好的做法,是不是太复杂了?在symfony中还有其他更好的处理方法吗?对于Symfony2提供的CRUD生成器的第一个问题,请查看 对于第二个,您应该使用framework提供的存储库模式,有关此签出的更多信息,请访问以下链接:
这个问题太宽泛了。Symfony2允许您实现几乎任何体系结构。一些程序员更喜欢在上面构建MVC,一些程序员更喜欢使用CRUD生成器或SonataAdmin之类的包。我更喜欢DDD方法来构建Symfony2应用程序。crub生成器的问题。。。如果取2个实体,则生成2个积垢。。。你有完全相同的代码。。。只有实体更改。。。我正在寻找一种方法来避免这种重复。对于Repositories也一样,您可以简单地对其进行抽象并重写子类中的实体属性。另外,请记住为BaseCrudController创建基本视图,尽管创建视图很难进行详细说明。我更喜欢使用Symfony2建议的结构。
parameters:
app.customer_manager.class: AppBundle\Manager\CustomerManager
services:
app.customer_manager:
class: %app.customer_manager.class%
arguments: [@doctrine.orm.entity_manager]
/**
* @Route("/edit/{customerId}", name="customer_edit")
* @Security("has_role('ROLE_ADMIN')")
*/
public function editAction($customerId, Request $request)
{
if (!$customer = $this->get('app.customer_manager')->loadCustomer($customerId)) {
throw new NotFoundHttpException($this->get('translator')->trans('This customer does not exist.'));
}
$form = $this->get('form.factory')->create(new CustomerType(), $customer);
if($form->handleRequest($request)->isValid()) {
$this->get('app.customer_manager')->saveCustomer($customer);
$request->getSession()->getFlashBag()->add('notice', 'Client bien enregistré.');
return $this->redirect(
$this->generateUrl(
'customer_show', array(
'customerId' => $customer->getId()
)
)
);
}
return $this->render('default/customer/add.html.twig', array(
'form' => $form->createView(),
'customer' => $customer
));
}