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