Symfony 2.5& twig:如何清理这段代码?

时间:2014-10-31 18:25:26

标签: php symfony doctrine twig yaml

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

我担心,如果我在这里写了太多代码。也许我想念一些我还不知道的Symfony背景魔法。详情如下。

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

的routing.yml

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

ItemController.php

我是否必须传递$item或者是否可以通过树枝获取数据?

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.twig

我是否必须在此处添加{id: item.id}

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

2 个答案:

答案 0 :(得分:1)

你可以替换

<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

答案 1 :(得分:1)

您的路线中id: null要求\d+无效,因为您实际上正在编辑现有实体,最好将其删除; $em->persist($item);也是不必要的,因为你已经在创建时保持并刷新它,这次你不需要再次持久化,只需要冲洗它。如果要向用户显示某些信息,例如“编辑具有SOME_TITLE标题的项目”,或者如果有一些图像字段要显示缩略图,则将$item传递给表单的次数是多少..,你可以传递它并追溯字段值,这是你的意思。另外注意,/items/edit/{id}不是很漂亮,通常它就像/items/{id}/edit/items/{id}/delete ...