Symfony 2:CRUD控制器 - 如何?

时间:2014-11-15 00:25:49

标签: php symfony design-patterns crud

我正在编写一个控制器来处理基本的CRUD功能,并且想知道,如果我做对了。

Symfony本身有很多很棒的功能,而且我想知道,如果我在这种情况下重新发明轮子。我有大约20个课程将由 CRUDController 进行扩展,我希望尽早使用最佳实践。

提前致谢!

CRUDController.php

namespace myApp\MyBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\BrowserKit\Response;
use Symfony\Component\HttpFoundation\Request;

class CRUDController extends Controller {

    protected $repo;
    protected $em = 'doctrine.orm.entity_manager';
    protected $templatePath;
    protected $itemsAlias = 'items';
    protected $itemAlias = 'item';
    protected $listingTemplate = 'list';
    protected $saveTemplate = 'save';
    protected $templateFileExtension = '.html.twig';   
    protected $entity;
    protected $formType; 
    protected $formMethod = 'POST';
    protected $indexRoute;
    protected $addSuccessMessage = 'Added.';
    protected $addErrorMessage = 'Not added';
    protected $editSuccessMessage = 'Edited.';
    protected $editErrorMessage = 'Not Edited.';

    public function indexAction()
    {
        return $this->render($this->templatePath . $this->listingTemplate . $this->templateFileExtension, array(
            $this->itemsAlias => $this->get($this->repo)->findAll()
        ));
    }

    public function addAction(Request $request) {
        return $this->save($request);
    }

    public function editAction($id, Request $request) {
        return $this->save($request, $id);
    }

    protected function save(Request $request, $id = null) {

        if (is_null($id)) {
            $item = new $this->entity();
        } else {
            $item = $this->get($this->repo)->find($id);
        }

        $form = $this->createForm(new $this->formType(), $item);
        if ($request->isMethod($this->formMethod)) {
            $form->handleRequest($request);

            if ($form->isValid()) {
                $em = $this->get($this->em);
                $em->persist($item);
                $em->flush();

                $this->get('session')->getFlashBag()->add(
                    'success',
                    is_null($id) ? $this->addSuccessMessage : $this->editSuccessMessage
                );
            } else {
                $this->get('session')->getFlashBag()->add(
                    'error',
                    is_null($id) ? $this->addErrorMessage : $this->editErrorMessage
                );
            }

            return $this->redirect($this->generateUrl($this->indexRoute));
        }

        return $this->render($this->templatePath . $this->saveTemplate . $this->templateFileExtension, array(
             'form' => $form->createView(),
             $this->itemAlias => $item
        ));
    }
}

MyController.php

namespace myApp\MyBundle\Controller;
use myApp\MyBundle\CRUDController;

class MyController extends CRUDController {
    public function __construct() {
        parent::__construct();

        $this->repo         = 'myapp.service.repository.item';
        $this->templatePath = '@myapp/items/';
        $this->itemsAlias   = 'myItems';
        $this->itemAlias    = 'myItem';
        $this->entity       = 'myApp\myBundle\Entity\Item';
        $this->formType     = 'myApp\myBundle\Form\Type\ItemType';
        $this->indexRoute   = 'items_index';
    }
}

1 个答案:

答案 0 :(得分:3)

根据我的经验 - " Universal Crud Controller"仅在项目启动时才有用。在开发期间,许多实体需要自定义修改。 关于你的想法的第二件事:在保存方法中,你应该有$em->persist($item);左右的IF,因为现有的实体不能再次持久化。 最后一件事:在开发过程中(并使用此代码),您应该考虑"拥有一面"关系,因为Doctrine只能处理拥有方的变更。它产生这样的问题: 产品有很多类别 - 关系双向。连接表是产品注释。您可以将“类别”添加到“产品”并成功保存。但是将产品添加到类别不会保存对数据库的更改(当然,您可以在保存期间手动处理它:])。