2014-04-04 44 views
0

我想一個形式顯示從數據庫中的數據,當用戶輸入他們要搜索將用戶引導到一個頁面,顯示從數據庫列表中的數據。舉個例子,我有一個表單,用他們的名字搜索一個人。的Symfony:檢索和使用表單提交

我SearchByFirstNameType.php:

class SearchByFirstNameType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
    $builder 
     ->setMethod('GET') 
     ->add('firstname','search',array(
      'label' => 'First Name:' 
     )) 
     ->add('submit', 'submit'); 
    } 

    public function getName() 
    { 
     return 'searchbyfirstname'; 
    } 
} 

我的控制器:

public function indexAction(Request $request) 
{ 
$searchperson = new Person(); 

$searchpersonform = $this->createForm(new SearchByFirstNameType(), $searchperson); 

if($this->getRequest()->getMethod() == 'GET') { 
    $searchpersonform->bind($this->getRequest()); 
    if($searchpersonform->isValid()) { 
     $repository = $this->getDoctrine()->getRepository('CIRBundle:Person'); 
     $person = $repository->findOneByFirstname($searchperson); 
     } 
    } 

    return $this->render('CIRBundle:Default:index.html.twig', array(
     'personform'  => $personform->createView(), 
     'searchpersonform' => $searchpersonform->createView(), 
      'person'    => $person 
    ));    
} 

在index.html.twig模板它給我一個「的CSRF令牌無效,請嘗試重新提交。形成。」錯誤。另外,'人'沒有定義。

我在做什麼錯?

+0

請向我們展示模板代碼。 –

回答

0

CSRF是Cross-site request forgery。您需要CSRF令牌來保護您的表單不被其他網站發送。如果您有一些有價值的信息可以通過僅供授權用戶進行表單提交進行更改或檢索,這會非常有用。欺詐者的網站可以擁有與您擁有相同的表格(它將引導用戶訪問您的網站),但是可以爲欺詐者提供有用的指定數據(例如,如果您有付款服務,它可以是接收者=欺詐者的付款詳情)。在這種情況下,你需要一些保護。 Symfony默認爲您提供保護。

但是你可以,如果你不需要它禁用此保護。例如,在你的情況下,你使用表單進行簡單的搜索。如果您的所有用戶都有能力通過此字段進行搜索,則無需擔心。

要禁用CSRF爲表單此方法添加到您的SearchByFirstNameType

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'csrf_protection' => false, 
    )); 
} 
+0

-1爲什麼禁用保護而不是解決問題? –

+0

我會刪除'-1'如果你到OP什麼CSRF是,爲什麼他解釋可以在這個特定背景下(搜索表單)禁用它。現在的答案並不能幫助OP理解它給他一個簡單的解決方案的問題,明天他不會更聰明。 –

+0

合理......我改變了我的搜索欄答案 –

0

我假設你的模板被單獨繪製表格字段的自定義HTML如使用form_row()form_widget()等。

在上面的例子中,您手動繪製了表單元素您創建了,但Symfony2表單具有一些額外的隱藏字段,例如CSRF保護字段。

由於上述原因,無論您何時手動渲染表單,您都應使用form_rest(form)來呈現缺少的字段(您尚未手動渲染的所有字段)。

+0

CSRF保護?這是一個笑話嗎?這是開銷,不需要作者。 –

+0

這是即使它沒有必要在這種特殊情況下的Symfony2的默認行爲。 –

+0

在瞭解爲什麼發生此問題以及CSRF所做的以及如何解決這種問題的任何類型表單後,禁用CSRF保護**是作者在通知自己之後做出的決定。 –