Настройка культуры пользователя при входе в систему с помощью 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, чтобы они работали.

Другие вопросы по тегам