使用 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%。
我正在为 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%。