我想要一个表单,当用户输入他们想要搜索的数据时,它会指向一个将显示数据库列表的页面。举个例子,我有一个用他们的名字搜索一个人的表格。
我的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令牌无效。请尝试重新提交表单。"错误。此外,' person'没有定义。
我做错了什么?
答案 0 :(得分:0)
CSRF是Cross-site request forgery。您需要CSRF令牌来保护您的表单免于从其他站点发送。如果您有一些有价值的信息可以通过仅为授权用户提交表单来更改或检索,这将非常有用。欺诈者网站可以采用与您相同的形式(它将引导用户访问您的网站),但具有可用于欺诈者的指定数据(例如,如果您有付款服务,则可以是接收者=欺诈者的付款详细信息)。在这种情况下,您需要一些保护。 Symfony默认为您提供保护。
但如果您不需要,可以禁用此保护。例如,在您的情况下,您使用表单进行简单搜索。如果您的所有用户都有能力通过此字段进行搜索,则无需担心。
要为表单停用CSRF,请将此方法添加到SearchByFirstNameType
:
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'csrf_protection' => false,
));
}
答案 1 :(得分:0)
我假设您的模板在自定义HTML中单独呈现表单字段,例如使用form_row()
或form_widget()
等。
在上述情况下,您手动呈现您创建的表单元素,但Symfony2表单有一些额外的隐藏字段,例如CSRF保护字段。
由于上述原因,每当您手动呈现表单时,都应使用form_rest(form)
呈现缺少的字段(您已经手动渲染的所有字段)。