2012-12-31 226 views
0

编辑:有一个文艺青年最爱的末...Symfony2的CSRF形式,令牌无效

我不断收到CSRF的错误,同时使用Symfony2中,并自动生成的表单。

这里是我的控制器:(新被称为显示形式,创建被称为上提交)

public function newAction($guru) 
{ 

    //Make the Entity Manager 
    $em = $this->getDoctrine() 
      ->getEntityManager(); 
    $guru = $em->getRepository('TSNStatsBundle:Guru') 
      ->findOneById($guru); 
    //If the guru id exists   
    if ($guru) 
    { 
     $alert = new Alert(); 
     //Create default values 
     $time = new \DateTime(2012-12-30); 
     $time->setTime(23,59); 

     //Set default times to "none available (23:59)" 
     $alert->setText($time) 
     ->setEmail($time) 
     ->setTwitter($time) 
     ->setChat($time) 
     ->setGuru($guru); 

     //Make the form, set types, 
     $formBuilder = $this->createFormBuilder($alert); 


     $formBuilder->add('buy', 'checkbox', array(
        'required' => false 
       )) 
       ->add('date', 'date', array(
        'input' => 'datetime', 
        'widget' => 'single_text' 
       )) 
       ->add('stock', new StockType()); 
     if ($guru->getInstantAlerts() ==1) 
     { 
      if ($guru->getText() == 1) 
      { 
       $formBuilder->add('text', 'time', array(
         'input' => 'datetime', 
         'widget' => 'text', 

        )); 
      } 
      if ($guru->getEmail() == 1) 
      { 
       $formBuilder->add('email', 'time', array(
         'input' => 'datetime', 
         'widget' => 'text', 

        )); 
      } 
      if ($guru->getTwitter() == 1) 
      { 
       $formBuilder->add('twitter', 'time', array(
         'input' => 'datetime', 
         'widget' => 'text', 

        )); 
      } 
      if ($guru->getChat() == 1) 
      { 
       $formBuilder->add('chat', 'time', array(
         'input' => 'datetime', 
         'widget' => 'text', 

        )); 
      } 
     } 
     $formBuilder->add('size') 
       ->add('short', 'checkbox', array(
        'required' => false 
       )) 
       ->add('his') 
       ->add('guru'); 
     $form = $formBuilder->getForm(); 



     return $this->render('TSNStatsBundle:Buy:new.html.twig', array(
      'form' => $form->createView(), 
      'guru' => $guru 
     )); 



    } 
    else 
    { 
     //your guru ain't real bro! 
    } 
    return $this->render('TSNStatsBundle:Buy:new.html.twig', array(
     'alert' => $alert, 
     'form' => $form->createView(), 
     'guru' => $guru->getName() 

    )); 
} 

public function createAction() 
{ 
    $alert = new Alert(); 

    $form = $this->createForm(new AlertType(), $alert); 
    $request = $this->getRequest(); 
    if ($this->getRequest()->getMethod() == 'POST') { 
     $form ->bind($request); 


     if ($form->isValid()) 
     { 
      $em = $this->getDoctrine() 
        ->getEntityManager(); 
      $em->persist($alert); 
      $em->flush(); 

      return $this->redirect($this->generateUrl('new_alert', array(
       'guru' => 2 
      ))); 

     } 
    } 

    return $this->render('TSNStatsBundle:Buy:errors.html.twig', array(
      'errors' => $form->getErrors() 
    )); 

} 

这里是我的模板:

Adding entry for {{ guru }} 
<form action="{{ path('create_alert') }}" method="post" {{ form_enctype(form) }} class="alert"> 
{{ form_widget(form) }} 
<p> 
    <input type="submit" value="Submit"> 
</p> 
</form> 

据我所知,一切都是由这本书。在每一个表格我每次刷新时间一_token值,它获取调用的小部件,因此各地应该有......

感谢,

编辑: 当我更换了我的整个表格的创建过程:

$form = $this->createForm(new AlertType(), $alert); 

然后它再次工作。问题是我想要的逻辑不属于“类型”类。这和事实,我做这件事的方式应该正确吗?这与我向表单添加元素的方式有什么关系?这是我看到的关于我的构建与createForm()构建的唯一不同。

铊;博士: 使用电话的CreateForm有*实体*类型的呼叫正常工作,创建一个使用createFormBuilder()获取会见了CSRF误差在每一个提交我自己的形式....同_token用于两个。

+0

可能是一个奇怪的问题,但会议的工作?如果每个综合浏览量都有一个新的会话标识,则会从表单的标识和会话标识中生成标记,这可能会出现这种情况。 – Maerlyn

+0

我还没有搞砸会议。我正在将现有网站转换为symfony,并随时进行学习,但事实是,当我使用createForm调用时发现它可以工作,这让我认为这不是问题。 – Maveric

+0

您确认输出html中没有隐藏的输入标签吗? – denkiryokuhatsuden

回答

1

尝试代

{{ form_widget(form) }} 
{{ form_rest(form) }} 

对于

{{ form_widget(form) }} 
+0

我也试过了。尽管form_widget(表单)调用了form_rest ..我的表单中有一个“_token”隐藏字段。 – Maveric

2

也许用这将帮助你:

{{form_widget(form._token)}} 
+0

感谢您的支持!我尝试了多个主题变体,例如'',但是这个是有所作为的。 – geoB