我按照这个示例对在我的actionController:http://www.craftitonline.com/2011/08/symfony-2-how-to-disable-csrf-on-a-per-form-basis/中生成的表单禁用csrf保护。
所以我要做的是:
public function contactAction(Request $request)
{
$this->focus = "contact";
$em = $this->getDoctrine()->getManager();
$contactPosts = $em->getRepository('VisualImmersionAdminBundle:Post')->findByPostCategory('Contact');
if (!$contactPosts) {
throw $this->createNotFoundException('Unable to find Post entity.');
}
$form = $this->createFormBuilder(
array(
'csrf_protection' => false
)
)
->add('Sujet', 'text',
array(
'label' =>false
)
)
->add('Nom', 'text',
array(
'label' =>false
)
)
->add('Entreprise', 'text',
array(
'label' =>false
)
)
->add('Courriel', 'email',
array(
'label' =>false
)
)
->add('Message', 'textarea',
array(
'label' =>false
)
)
->getForm();
$form->handleRequest($request);
if ($form->isValid()) {
$data = $form->getData();
$message = \Swift_Message::newInstance()
->setSubject($data['Sujet'] . ' ' . $data['Entreprise'])
->setFrom($data['Courriel'])
->setTo('contact@visual-immersion.com')
->setBody('text à placer par la suite')
;
$this->get('mailer')->send($message);
}
return $this->render('VisualImmersionSiteBundle:Site:contact.html.twig',
array(
'focus' => $this->focus,
'form' => $form->createView(),
'contactPosts' => $contactPosts,
));
}
在我的树枝上:
div class="semi-container">
{% if form_errors(form) %}
<div class="errors">{{ form_errors(form) }}</div>
{% endif %}
<form class="contact-form" action="{{ path('visual_immersion_site_contactpage') }}" method="post" {{ form_enctype(form) }}>
{{ form_row(form.Sujet, { 'attr': {'placeholder': 'Objet' }}) }}
{{ form_row(form.Nom, { 'attr': {'placeholder': 'Nom' }}) }}
{{ form_row(form.Entreprise, { 'attr': {'placeholder': 'Entreprise' }}) }}
{{ form_row(form.Courriel, { 'attr': {'placeholder': 'Courriel' }}) }}
{{ form_row(form.Message, { 'attr': {'placeholder': 'Message' }}) }}
<button type="submit" class="link-know-more">Demander un devis !</button>
</form>
</div>
但是form_errors总是返回错误:
CSRF令牌无效。请尽量重新提交表格。
在我的小树枝上,邮件还没寄出去.
我使用命令缓存进行了验证:清楚是否存在问题,但没有,这不是缓存问题。
知道吗?
(谢谢你的帮助:)
编辑:
好的,我解决了我最初的问题:
Form_rest(表单)用于隐藏输入。
但随着csrf的关闭,我不需要,对吗?
发布于 2013-11-12 22:21:44
您不能在没有类的情况下使用$form->isValid()
,因为它检查类约束。handleRequest()
检查表单验证规则,因此如果需要的话,必须向表单生成器添加验证规则。
查看您所链接的教程,特别是
$form = $this->createFormBuilder($users, array(
'csrf_protection' => false, // <---- set this to false on a per Form Instance basis
))->add(...)
;
这应该更好
$form = $this->createFormBuilder(null, array(
'csrf_protection' => false
))
这是唯一让我觉得不对的事情。
一个很好的替代方法是创建一个虚拟实体,用于创建表单,但不要持久化。
https://stackoverflow.com/questions/19940089
复制相似问题