我在<开启symfony的CSRF保护>一文中简单的介绍了CSRF的概念和使用方法, 由于那篇文章是学习symfony的初期写的, 所以对form和csrf理解的还不够透彻, 通过之后的学习和研究又渐渐的了解了一些细节.
首先, 在form被正确的应用的情况下, csrf是完全可以被兼容的, 这里先简单讲一下自定义的form的注意事项.
在定义form的时候, 我们需要定义名字格式, symfony自动生成的form应该已经设定了格式,不再需要重新设置。
class CityForm extends BaseCityForm{
...
function setup()
{
...
$this->widgetSchema->setNameFormat('city[%s]');
...
}
...
}
这样我们将form中所有元素的值都放到了一个Parameter的子数组中.接下来在取得表单值的时候需要使用如下方法.
$this->form->bind($request->getParameter($this->form->getName()));
if($this->form->isValid()){
...
}else {
...
}
这样避免了手动构造bind的参数,也避免了在bind的参数中出现多余字段的问题,而且还可以完全兼容csrf,这也正是官方生成的代码所使用的方法。
本文完。
