如何在登录过程中设置用户文化,该过程由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()
永远不会运行。
登录后我无法将逻辑设置在默认页面上,因为用户并不总是重定向到同一页面甚至同一模块。
答案 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操作会话数据,以便它可以工作。