此表单不应包含额外字段createNamed Form null name和PUT方法

时间:2014-05-07 07:10:19

标签: forms validation symfony

我有一个问题,当我创建一个没有表单名称的命名表单时,如下所示:

$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()) {
        //...
    }
}

0 个答案:

没有答案