我有一个问题,当我创建一个没有表单名称的命名表单时,如下所示:
$this->get('form.factory')->createNamed(null, new UserFormType(), array());
其中此UserFormType被定义为具有PUT方法
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->setMethod('PUT');
$builder->add('firstname', 'text', array('label' => 'First Name'));
$builder->add('lastname', 'text', array('label' => 'Last Name'));
$builder->add('register', 'submit');
}
然后,当我对请求进行绑定时,我收到错误'此表单不应包含额外字段'。
if ($request->getMethod() == 'PUT') {
//$form->bind($request);
$form->handleRequest($request); // updated as per jperovic's comment
if ($form->isValid()) {
//...
}
}
但是当我删除以下行
时$builder->setMethod('PUT');
并将方法检查更改为POST
if ($request->getMethod() == 'POST') {
它运作得很好。
如果我给表单命名,它也有效。
$this->get('form.factory')->createNamed('user_form', new UserFormType(), array());
为什么PUT不适用于非命名表单的任何想法?
编辑:在下面解决
替换:
if ($request->getMethod() == 'PUT') {
//$form->bind($request);
$form->handleRequest($request); // updated as per jperovic's comment
if ($form->isValid()) {
//...
}
}
使用:
if ($request->getMethod() == 'PUT') {
$request_data = $request->request->all();
$children = $form->all();
$intersect = array_intersect_key($request_data, $children);
// Added token check for csrf protection
if (array_key_exists('_token', $request_data)) {
$intersect['_token'] = $request_data['_token'];
}
$form->submit($intersect);
if ($form->isValid()) {
//...
}
}