2014-03-29 122 views
1

我的項目在本地計算機上正常工作。但是,一旦我將其上傳到OVH服務器上,當我提交我有的任何表格時(例如註冊FOSUserBundle以及我自己的表格),我都會遇到一些問題。Symfony CSRF令牌無效

問題是當我提交表單時我有一個無效的CSRF令牌。

我嘗試了許多解決方案:

  • 我加{{ form_rest(form) }}我的樹枝文件。

  • 我更改csrf_protectionfalseapp/config/config.yml然後請求被submited沒有任何領域的形式。

注意:我嘗試了symfony 2.4和2.3,但問題仍然存在。

我的樹枝:

<form id="modifier_form" name="modifier_form" method="post" {{ form_enctype(form) }}> 
    <div id="form_prenom">{{ form_row(form.prenom) }}</div> 
    <div id="form_nom">{{ form_row(form.nom) }}</div> 

    <div id="form_situation_pro"> 
     <label>Situation professionnelle</label> 
     <select name="optone" 
       id="pays_select" 
       onchange="setOptions(document.modifier_form.optone.options[document.modifier_form.optone.selectedIndex].value);"> 
        <option value=" " selected="selected"> </option> 
        {% for a in pays %} 
         <option value="{{ a.getId }}">{{ a.getName }}</option> 
        {% endfor %} 
     </select> 
    </div> 
    <div id="form_situation_pro_sous"> 
     <label></label> 
     <select name="opttwo" id="region_select"> 
      <option value=" " selected="selected"></option> 
     </select> 
    </div> 

    {{ form_widget(form) }} 
    {{ form_restt(form) }} 
    <input type="submit" value="Enregistrer" /> 

我的控制器

public function modifierAction(){ 
    $connecteduser =$this->getUser(); 
    $fich=$connecteduser->getFichsig(); 
    //si l'utulisateur a deja une fiche sinon il faut le remplire 
    if(!$fich){ 
     $fich = new Fichsig; 
     $connecteduser->setFichsig($fich); 
    } 

    $myuser=$this->getDoctrine() 
     ->getManager() 
     ->getRepository('TS\InscriptionBundle\Entity\User')->findByEmail($connecteduser->getEmail()); 

    $form = $this->createForm(new UserType($this->getDoctrine()->getManager()), $connecteduser); 

    $request = $this->getRequest(); 
    if ($request->isMethod('POST')) { 
     $form->bindRequest($request); 
     if ($form->isValid()) { 
      //get parametres 
      //// 
      $connecteduser->setFichsig($fich); 
      $em = $this->getDoctrine()->getManager(); 
      $em->merge($connecteduser); 
      $em->flush(); 
      return $this->redirect($this->generateUrl('ts_inscription_profil')); 
     } 
    } 
    // On passe la méthode createView() du formulaire à la vue afin qu'elle puisse afficher le formulaire toute seule 
    return $this->render('TSInscriptionBundle:Logged:modifier_logged_layout.html.twig', array(
     'form' => $form->createView(), 
     'pays'=>$this->pays(), 
     'region'=>$this->region(), 

    )); 
} 

我config.yml

framework: 
#esi:    ~ 
translator:  { fallback: "%locale%" } 
secret:   "%secret%" 
router: 
    resource: "%kernel.root_dir%/config/routing.yml" 
    strict_requirements: ~ 
form:   ~ 
csrf_protection: ~ 
validation:  { enable_annotations: true } 
templating: 
    engines: ['twig'] 
    #assets_version: SomeVersionScheme 
default_locale: "%locale%" 
trusted_hosts: ~ 
trusted_proxies: ~ 
session: 
    # handler_id set to null will use default session handler from php.ini 
    handler_id: ~ 
fragments:  ~ 
http_method_override: true 
+0

你可以發佈一些PHP,樹枝和相應的生成HTML嗎? –

回答

-1

如果你使用symfony的設置形式結束2.3

{{ form_end(form, {'render_rest': false}) }} 
+0

我試過但沒有改變。 – maher88

+0

我想提醒你,它在本地(dev和prod模式)上工作正常。 – maher88

+0

@Yakiv Mospan,它是一個小枝代碼而不是java。它{{...}} – user3144880

1

你寫

{{form_restt(表)}}

它應該是這樣的:

{{form_rest(表)}}

和也刪除{{ form_widget(form) }}。它用於渲染表單的一部分。由於您已經提交了字段form.prenom。 form_rest會渲染其餘的字段。

編碼快樂......

+0

對不起,我在{{form_restt(form)}}複製時犯了一個錯誤我也刪除了{{form_widget(form)}}但仍然沒有任何變化 – maher88

+0

您可以嘗試更新您的表單類型** setDefaultOptions **功能像[這裏](http://pastebin.com/ydLnPTee)並讓我知道結果 – xiidea

+0

我已經嘗試過並重試了一遍。結果是表單中有100個空值,它用空值更新我的數據庫 – maher88

0

你可以簡單地讓樹枝使用使其爲你{{表單(form)}}一旦開始使用小部件,行和標籤,那麼你將不得不使用{ {form_start(表)}}和提交按鈕後和前{{form_end(表)}}你應該把{{form_rest(表)}}

我認爲你缺少form_end並更正form_rest,因爲它有一個拼寫錯誤