Symfony表单值不绑定

时间:2012-08-05 23:35:46

标签: symfony1 symfony-1.4 symfony-forms

我使用Symfony 1.4表单作为简单的登录模块。表单非常基本,下面列出了代码:

<?php 

class LoginForm extends sfFormSymfony 
{
 public function configure()
 {
  $this->setWidgets( 
         array('username' => new sfWidgetFormInputText(),
               'password' => new sfWidgetFormInputPassword(),));
              // 'remember_me' => new sfWidgetFormSelectCheckbox(array('choices'=>array('true'=>''))),));

   $this->widgetSchema->setNameFormat('login[%s]');
   $this->setValidators(array(
         'username' =>  new sfValidatorString(array('required'=>true)),        
         'password' =>  new sfValidatorString(array('required'=>true)),
     ));
 }

}

表单按预期在模板页面中呈现正常。仅供参考,我使用$ form ['username'] - &gt;渲染方法来单独渲染我喜欢它们的方法,而不是回显表单。

在发布(识别)后,我将值绑定到这样的表单:

$this->form->bind($request->getParameter('login')); 

然而,它不符合条件

$this->form->isValid();

这两个字段都没有留空,凭据是正确的,所以这对我来说似乎更隐蔽。

执行var_dump($ this-&gt; form-&gt; getValues());它返回一个空数组,我相信这意味着值不是检索也不是绑定。

任何人都可以找到我可能搞砸的地方吗?

谢谢

3 个答案:

答案 0 :(得分:2)

从symfony 1.3开始,默认情况下启用csrf保护。这意味着所有表单都会获得一个名为_csrf_token的csrf标记字段 - 它是一个隐藏字段,对于您的会话和给定的表单类型而言是唯一的。

如果你不用表格的其余部分渲染和提交这个字段,它将无效 - 它会检测到csrf攻击,所以这样做很好。

简短修复是渲染令牌字段:

echo $form["_csrf_token"]->render();

但更好的方法是一次性渲染所有隐藏的字段(我通常在提交按钮旁边执行此操作):

echo $form->renderHiddenFields();

答案 1 :(得分:1)

如果你真的需要,你可以使用一个小片段来显示如下错误:

foreach ($this->getErrorSchema() as $field => $error) {

    if ($error instanceof sfValidatorErrorSchema) {
        foreach ($error as $field => $error) break;
    }

    echo $field . ' => ' . $error; // e.g. "Field name" => "Error message".

}

答案 2 :(得分:0)

@Maerlyn解决了这个问题。供将来参考:

表单字段是单独呈现的,而不是使用vanilla echo $ form。因此,我没有渲染$ form [&#39; _csrf_token&#39;] - &gt; render()应该已经完成​​。由于登录失败。同时渲染csrf_token字段,你就可以了。