1

在 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()永远不会运行。

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

4

3 回答 3

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());
}

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

于 2013-02-27T08:24:07.077 回答
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()函数放入此文件中。它将自动覆盖插件中的原始文件。

于 2013-02-27T08:13:13.503 回答
0

在身份验证之前,您无权访问 sfGuardUser 对象。这并不意味着您无权从您需要的操作实例访问 sfUser。

是否行

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

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

因此,如果那条线没有设置文化,请寻找其他地方。我将首先检查请求中是否存在文化,这种形式可能会覆盖您的前一行,因此请尝试交换它们。

在 Symfony 中,sfUser 代表一个 PHP 会话,它在用户登录而不是用户之前启动。您尝试通过 sfUser::setAttribute 操作会话数据,这样应该可以工作。

于 2013-02-26T23:36:24.697 回答