Symfony 2.5&;小树枝:如何清理这个代码


Symfony 2.5 & twig: how to clean up this code?

我是Symfony的新手,希望尽早使用最佳实践。我下面的代码可以工作,但感觉有点脏。

我担心,如果我在这里写了太多代码。也许我错过了一些我还不知道的Symfony背景魔术。详细信息如下。

你会改变什么(为什么)?我感谢每一个建议,成为一个更好的开发人员。提前感谢!

路由。yml

items_edit:
  path:     /items/edit/{id}
  defaults: { _controller: myBundle:items:edit, id: null } # null = if not set?
  requirements:
    id: 'd+

ItemController.php

我必须传递$item吗?或者数据无论如何都可以通过trick获得吗?

public function editAction($id, Request $request) {
    $em   = $this->getDoctrine()->getManager();
    $repo = $em->getRepository('ItemsRepo');
    $item = $repo->find($id);
    $form = $this->createForm(new ItemFormType(), $item);
    if ($request->isMethod('POST')) {
        $form->handleRequest($request);
        if ($form->isValid()) {
            $em->persist($item);
            $em->flush();
            $this->get('session')->getFlashBag()->add('info', 'saved.');
            return $this->redirect($this->generateUrl('items_list'));
        }
    }
    return $this->render('edit.html.twig', array(
        'form' => $form->createView(),
        'item' => $item // !!!
    ));
}

edit.html.trick

我必须在这里添加{id: item.id}吗?

{% block content %}
    <form action="{{ path('items_edit', {id: item.id}) }}" method="POST" {{ form_enctype(form) }}>
        {# ... custom stuff ... #}     
    {{ form_end(form) }}
{% endblock %}

您的路由中有'd+要求的id: null是无用的,因为您实际上正在编辑现有实体,所以最好将其删除;$em->persist($item);也是不必要的,因为你已经在创建时持久化并刷新了它,这次你不需要再次持久化,只需刷新它。如果你想向用户显示一些信息,比如"编辑标题为some_title的项目",或者如果有一些图像字段你想显示缩略图,那么把$item传递给表单又如何呢。。,你可以传递它并检索字段值,它就是u。。另外要注意的是,/items/edit/{id}不是很漂亮,通常是像/items/{id}/edit/items/{id}/delete。。。

您可以替换

<form action="{{ path('items_edit', {id: item.id}) }}" method="POST" {{ form_enctype(form) }}>

带有

{{ form_start(form) }}

这样就不需要将item传递给模板。

http://symfony.com/doc/current/book/forms.html#rendering-a-form-in-a-template