0

我正在为一个简单的登录模块使用 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']->render 方法来单独渲染我喜欢的方法,而不是回显表单。

在发布(已识别)后,我将值绑定到如下形式:

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

但是,它不符合条件

$this->form->isValid();

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

在执行 var_dump($this->form->getValues()); 它返回一个空数组,我认为这意味着这些值未被检索或绑定。

任何人都可以发现我可能搞砸的地方吗?

谢谢

4

3 回答 3

2

从 symfony 1.3 开始,默认启用 csrf 保护。这意味着您的所有表单都会获得一个_csrf_token默认命名的 csrf 令牌字段 - 它是您的会话和给定表单类型所独有的隐藏字段。

如果您不与表单的其余部分一起呈现和提交此字段,它将无效 - 它检测到 csrf 攻击,所以这种方式很好。

简短的解决方法是呈现令牌字段:

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

但更好的方法是一次性渲染所有隐藏字段(我通常在提交按钮旁边这样做):

echo $form->renderHiddenFields();
于 2012-08-06T07:18:07.143 回答
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".

}
于 2012-08-06T07:29:34.400 回答
0

@Maerlyn 解决了这个问题。备查:

表单字段是单独呈现的,而不是使用 vanilla echo $form。因此,我没有渲染应该完成的 $form['_csrf_token']->render() 。因此登录失败。渲染 csrf_token 字段,你就可以开始了。

于 2012-08-06T06:57:05.720 回答