Symfony2保持干燥的最佳实践

Symfony2保持干燥的最佳实践,symfony,doctrine-orm,coding-style,dry,Symfony,Doctrine Orm,Coding Style,Dry,我是Symfony2的新手。我必须为我的新工作学习它,这周一开始。在那之前,我用了很多CodeIgniter。。。所以这有点变化 在阅读了大量的文档、教程和最佳实践之后。。。创建我自己的内部网以测试客户有网站、网站有访问权限、访问权限有网站、网站有类别、访问权限有访问权限类别我还有一些问题 第一个问题: 当你有一个带有前端和后端的网站时,你总是有一些重复的动作,比如: -创建新实体 -读取实体 -更新实体 -删除实体 在CI中,我创建了一个BaseController和一个BaseModel,

我是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\BaseManager

<?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
    ));

}