在symfony中将变量从控制器传递到视图的更好方法

时间:2011-01-27 09:03:43

标签: authentication symfony1

嘿。 我有一个以post作为方法的登录表单。该操作转到“auth / login”,如果用户存在,将检查数据库。如果用户存在,我会调用 $this->getUser->setAuthenticated(true);。在此之后,如果成功,我想重定向到欢迎页面。

如果登录失败,我当然希望在视图中告诉用户。但是只有在登录失败的情况下控制器中的设置变量,并且在视图中检查是否设置了每个变量,是否有很多工作要做?

这意味着我必须在控制器的视图集中检查我想要使用的几乎所有变量。如果它应该发生,它没有设置,我只是继续并回应它,我从symfony得到一个错误,生产stage-mode-ish除了 500 internal server error 之外不显示任何内容。

由于

编辑:

这是我目前的新的更好的解决方案。还在寻找反馈。

/ templates / loginSuccess

if ($sf_params->has('bad_login')) { echo "Wrong username or password"; }

在我的控制器中:

$this->redirect('auth/login?bad_login=');

3 个答案:

答案 0 :(得分:1)

看看sfDoctrineGuardPlugin(事实上的身份验证标准)是如何做到的:他们创建了sfGuardValidatorUser并将其用作signin form中的帖子验证器。

此方法的优点:表单负责用户名/密码验证,您无需将该代码放入您的操作中。它将其简化为简单的$form->isValid() { $this->redirect("@homepage"); }

答案 1 :(得分:0)

您似乎可以使用symfony的表单来处理验证。由于表单显示内置错误,您可以将其放入表单验证中,然后您的控制器看起来像:

$form = new LoginForm;
if ($request->isMethod('post')) 
{
  if ($form->isValid())
  {
    $this->redirect('account');
  }
  else
  {
    // this would show the form, and since you put the login in the form validation it will show errors. You could have the username show the error
  }
}

要做你正在做的事,我建议这样做。这样你也不会访问视图中的任何参数。

控制器:

$this->bad_login = $this->getParameter('bad_login',false);

查看:

if ($bad_login) { echo 'bad login'; }

答案 2 :(得分:0)

  1. 使用forward()
  2. 将视图填充所需的所有逻辑放入控制器的单独方法中,并在两个位置调用它。
  3. 使用cgratigny的解决方案 - 将登录表单和处理代码放在一个操作中,如果isMethod('post') && $login_success
  4. ,则重定向到欢迎页面
相关问题