使用 Symfony 3 的表单

Forms with Symfony 3

我正在为 Symfony 3 中的表单而苦苦挣扎。

设置非常简单。

一个。 /src/AppBundle/Controller/Admin/MovieAdminController.php

中的控制器
namespace AppBundle\Controller\Admin;

use AppBundle\Form\MovieFormType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

/**
 * @Route("/admin")
 */
class MovieAdminController extends Controller
{
    [...]

    /**
     * @Route("/movie/new", name="admin_movie_new")
     */
    public function newAction(Request $request)
    {
        $form = $this->createForm(MovieFormType::class);

        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            dump($form->getData());
        }

        return $this->render('admin/movie/new.html.twig', [
            'movieForm' => $form->createView()
        ]);
    }
}

乙。 /src/AppBundle/Form/MovieFormType.php

中的表单类型
namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class MovieFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add('genre')
            ->add('budget');
    }

    public function configureOptions(OptionsResolver $resolver)
    {

    }

}

C。树枝模板:

[...]
{{ form_start(movieForm) }}
{{ form_widget(movieForm) }}

<button type="submit" class="btn btn-primary">Save</button>

{{ form_end(movieForm) }}
[...]

当我提交表单时,我不断收到可怕的消息 "The CSRF token is invalid. Please try to resubmit the form."

表单确实有带有token的隐藏字段,但在我看来,提交的值与会话中的值不同。

在分析器中我看到:

POST 参数

movie_form  [ title => blabla, genre => blabla, budget => 123, _token => e-zvG9Gk0qBJzTE4exIK3K5katq9-_AFEAWyTptx7rg ]

会话参数

_csrf/movie_form    QxbBQISsIwQLUlwWwAPa_l2xZbB5zqdHOwaOxrNAHtg

感谢您的帮助

您必须将广告放在视图的末尾 {{ form_end(movieForm) }} {{form_rest(movieForm)}} 之前。你的代码看起来像

{{ form_start(movieForm) }}
{{ form_widget(movieForm) }}
{{form_rest(movieForm)}}
<button type="submit" class="btn btn-primary">Save</button>

{{ form_end(movieForm) }}

我能够解决我的问题。

所有都是由于 Symfony 会话处理。我正在使用 Vagrant VM (Debian Jessie),app/config/config.yml 中的标准设置不起作用(参见 Github 上的 issue)。

只有一点点变化:搜索行

handler_id:  session.handler.native_file

并将其更改为

handler_id:  ~

然后一切开始 100%。