我是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 %}
答案 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
...