Настройка культуры пользователя при входе в систему с помощью sfDoctrineGuardPlugin
Как настроить культуру пользователя во время процесса входа, который обрабатывается 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 ответа
Я пойду на что-то проще, чем воссоздать действие.
В вашем файле /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());
}
Таким образом, каждый раз, когда пользователь входит в систему, его культура настраивается.
Ваше первое предположение - правильный подход, просто нужно изменить;)
Вместо вызова родителя 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()
Функция в этом файле. Он автоматически переопределит оригинал из плагина.
У вас нет доступа к объекту sfGuardUser до аутентификации. Это не означает, что у вас нет доступа к sfUser из экземпляра действия, который вам нужен.
Ли линия
$this->getUser()->isAuthenticated()
не предлагает вам, что пользователь не обязательно аутентифицирован, когда вы звоните.
Так что, если эта линия не устанавливает культуру, посмотрите куда-нибудь еще. Я бы начал с проверки, присутствует ли культура в запросе в какой-либо форме, которая может переопределить вашу предыдущую строку, поэтому попробуйте поменять их местами.
В Symfony sfUser представляет сеанс PHP, который запускается до входа пользователя, а не пользователя. Вы пытаетесь манипулировать данными сеанса через sfUser::setAttribute, чтобы они работали.