我希望通过PUT方法发送数据,我的控制器操作:
public function updateTestAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$progress = $em->getRepository('CodeCatsPanelBundle:Progress')->find(5);
//$form = $this->createForm(new ProgressType(), $progress, array('method' => 'PUT'))->add('submit', 'submit');
$form = $this->createForm(new ProgressType(), $progress)->add('submit', 'submit');
$form->handleRequest($request);
return $this->render('CodeCatsPanelBundle:Progress:test.html.twig', [
'form' => $form->createView(),
'valid' => $form->isValid(),
'progress' => $progress,
'request' => $request
]);
}
第一个表单工作正确,但当我将方法更改为PUT时,我收到验证错误:
此表单不应包含额外字段。
我知道Symfony2使用post和extra hidden field _method但是在这种情况下如何有效数据?
答案 0 :(得分:1)
只需在模板中添加隐藏的输入,例如:
<form action='your route'>
<input type='hidden' name='_method' value='PUT'>
//do something.......
</form>
在你的行动中:
public function updateTestAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$progress = $em->getRepository('CodeCatsPanelBundle:Progress')->find(5);
$form = $this->createForm(new ProgressType(), $progress)->add('submit', 'submit');
$form->handleRequest($request);
if ($form->isValid()){
//do something
}
return $this->render('CodeCatsPanelBundle:Progress:test.html.twig', [
'form' => $form->createView(),
'valid' => $form->isValid(),//you need this?
'progress' => $progress,
'request' => $request
]);
}
路径配置文件中的:
yourRouteName:
path: /path
defaults: { _controller: yourBundle:XX:updateTest }
requirements:
_method: [PUT]
答案 1 :(得分:0)
大多数浏览器不支持通过发送PUT和DELETE请求 HTML表单中的method属性。
幸运的是,Symfony为您提供了一种简单的解决方法 这个限制。
在web/app.php
:
Request::enableHttpMethodParameterOverride(); // add this line
在树枝模板中
{# app/Resources/views/default/new.html.twig #}
{{ form_start(form, {'action': path('target_route'), 'method': 'GET'}) }}
在表格中
form = $this->createForm(new TaskType(), $task, array(
'action' => $this->generateUrl('target_route'),
'method' => 'GET',
));
在控制器中/懒惰的方式
$form = $this->createFormBuilder($task)
->setAction($this->generateUrl('target_route'))
->setMethod('GET')
->add('task', 'text')
->add('dueDate', 'date')
->add('save', 'submit')
->getForm();
与上述相同,只是步骤2,默认情况下完成第1步。
与上述步骤1和2相同。