Php 在Symfony2中编辑表单

Php 在Symfony2中编辑表单,php,forms,symfony,doctrine-orm,twig,Php,Forms,Symfony,Doctrine Orm,Twig,我没有使用Doctrine的生成器,因为我认为代码很难看,因此我试图让它在我的editAction中工作,并在我的edit.html.twig页面中呈现表单,但我无法让它工作。我试图效仿其他答案给出的其他例子,但它们也不起作用 首先,我的editAction public function editAction($id, Request $request) { $manager = $this->getDoctrine()->getManager(); $entity

我没有使用Doctrine的生成器,因为我认为代码很难看,因此我试图让它在我的
editAction
中工作,并在我的
edit.html.twig
页面中呈现表单,但我无法让它工作。我试图效仿其他答案给出的其他例子,但它们也不起作用

首先,我的
editAction

public function editAction($id, Request $request)
{
    $manager = $this->getDoctrine()->getManager();
    $entity = $manager->getRepository('PanelBundle:Material')->find($id);

    if (!$entity) {
        throw $this->createNotFoundException('O material procurado não está cadastrado');
    }

    $form = $this->createForm(new MaterialType());
    $form->handleRequest($request);

    if ($request->getMethod() == 'POST') {
        $form->submit($request);

        if ($form->isValid()) {
            $manager->merge($entity);
            $manager->flush();

            $this->addFlash('success', 'Material alterado');

            return $this->redirect($this->generateUrl('panel_materials'));
        }
    }

    return $this->render('PanelBundle:Material:edit.html.twig', array(
        'entity' => $entity
    ));
}
现在,我的小树枝

{% extends '::layout.html.twig' %}

{% block title %}Editar {{ entity.name }}{% endblock %}

{% block body %}
    <div class="container">
        <h1>Editar {{ entity.name }}</h1>

        <form action="{{ path('panel_edit_material', { 'id': entity.id }) }}" method="POST">
            <div class="form-group">
                {{ form_row(entity.name) }}
            </div>
            <div class="form-group">
                {{ form_row(entity.description) }}
            </div>
            <div class="form-group">
                {{ form_row(entity.quantity) }}
            </div>
            <div class="form-group">
                {{ form_row(entity.price) }}
            </div>

            {{ form_rest(form) }}

            <button type="submit" class="btn btn-success">Alterar</button>
        </form>
    </div>
{% endblock %}
{%extends'::layout.html.twig%}
{%block title%}Editar{{entity.name}{%endblock%}
{%block body%}
Editar{{entity.name}
{{form_row(entity.name)}}
{{form_row(entity.description)}}
{{form_row(entity.quantity)}}
{{form_row(entity.price)}
{{form_rest(form)}
奥特拉尔
{%endblock%}

两件事:如果我删除
{'id':entity.id}
,会显示一个错误,表示缺少一个必填字段,如果我现在这样做,它会说
searchandenderblock()必须是Symfony\Component\Form\FormView
,如果不是在controller中返回
$entity
,而是返回
$Form->createView()
,错误表示
FormView无法转换为字符串

FormView无法转换为字符串
错误可能是在尝试将实体id传递到位于
{'id':entity.id}
的路径函数时引起的

对我来说,最简单的解决方案似乎是将表单传递给视图(正如您所说的那样),但要从
表单
标记中删除整个
操作=“{{path('panel_edit_material',{'id':entity.id}}}”
属性

如果缺少
操作
属性,它将默认为当前url(如果我理解示例,这应该可以工作)

如果这不起作用,您仍然可以这样传递实体的id:
{{path('panel_edit_material',{'id':form.id.vars.value}}}
。这还需要将表单传递给视图,而不是实体

希望这有帮助:)


编辑:重读时,我注意到使用了
{{entity.name}
。如果将for传递给视图,则需要将其更改为
{{form.name.vars.value}
,或者只需将
实体
表单
传递给视图,这样就可以选择显示原始值或新值

多亏了布莱希特的启发,我已经设法解决了这个问题

在我的例子中,解决方案是从页面中删除
表单行(..)
,只留下如下内容:

<form action="{{ path('panel_edit_material', { 'id': entity.id }) }}" method="POST">
    <div class="form-group">
        {{ form_rest(form) }}
    </div>
    <button type="submit" class="btn btn-success">Alterar</button>
</form>
以及:

就这样

$form = $this->createForm(new MaterialType(), $entity);
return $this->render('PanelBundle:Material:edit.html.twig', array(
    'form' => $form->createView(),
    'entity' => $entity
));