使用sfDoctrineGuard插件登录时设置用户文化

时间:2013-02-26 23:24:44

标签: php internationalization symfony-1.4 sfguard sfdoctrineguard

如何在登录过程中设置用户文化,该过程由sfDoctrineGuardPlugin处理?每个用户都可以设置存储在sfGuardUserProfile表中的首选语言。

最初我曾考虑通过做类似的事情来覆盖executeSignin()函数:

public function executeSignin(sfWebRequest $request)
{
  $this->getUser()->setCulture($this->getUser()->getGuardUser()->getProfile()->getLanguage());
  parent::executeSignin($request);
}

但显然我不能这样做,因为在执行父函数之前我无法访问GuardUser对象。

然后我考虑创建一个类似于此的postExectute()函数:

public function postExecute()
{
  if($this->getUser()->isAuthenticated()){
    //SET USER CULTURE
  }
}

但是再次这不起作用,因为登录功能会重定向,因此postExecute()永远不会运行。

登录后我无法将逻辑设置在默认页面上,因为用户并不总是重定向到同一页面甚至同一模块。

3 个答案:

答案 0 :(得分:2)

我会比重新制作动作更容易。

扩展/apps/[your app]/lib/user/myUser.class.php的文件sfGuardSecurityUser

您可以像这样覆盖signIn函数:

public function signIn($user, $remember = false, $con = null)
{
  parent::signin($user, $remember, $con);

  $this->setCulture($user->getProfile()->getLanguage());
}

因此,每次用户登录时,都会设置其文化。

答案 1 :(得分:1)

你的第一个猜测是正确的方法,只需要改变;)

而不是调用父executeSignin()编写您自己的登录操作(例如复制插件使用的操作)。然后添加您需要的行

$this->getUser()->setCulture($this->getUser()->getGuardUser()->getProfile()->getLanguage());

在重定向之前 - 所以当您已经将配置文件分配给用户会话时。

您可以更改settings.yml中的设置,让sfDoctrineGuard使用新操作:

all:
  .settings:
    login_module:          myCleverModule
    login_action:          signinMyUser

您还可以在app/appName/modules/sfGuardAuth/actions中创建一个文件夹,在其中创建actions.class.php并将executeSignin()功能放入此文件中。它会自动覆盖插件中的原始内容。

答案 2 :(得分:0)

在身份验证之前,您无权访问sfGuardUser对象。这并不意味着您无法访问action实例中的sfUser,而这正是您所需要的。

该行

$this->getUser()->isAuthenticated()

不建议您在调用时不必对用户进行身份验证。

因此,如果该行未设置文化,请查看其他地方。我首先检查请求中的文化是否以某种形式存在,可能会覆盖您之前的行,因此请尝试交换它们。

在Symfony中,sfUser表示在用户登录之前启动的PHP会话,而不是用户。您尝试通过sfUser :: setAttribute操作会话数据,以便它可以工作。