2015-01-14 2 views
0

У меня есть функции setAttribute ($ key, $ value) и getAttribute ($ key, $ default) в моем классе User. Когда пользователь аутентифицирован, я хочу установить несколько атрибутов, которые будут использоваться позже в разных контроллерах.Symfony2 изменить глобальную ссылку пользователя?

Я попытался установить атрибуты в моей функции обработчика успеха:

public function onAuthenticationSuccess(Request $request, TokenInterface $token) 
{ 
     $token->getUser()->setAttribute("user_data_set", 1); 
} 

Но когда я попытался назвать его в своем контроллере значение не установлено

public function indexAction(Request $request) { 

    //Get the logged in user 
    $user = $this->getUser(); 
    //Entity Manager 
    $em = $this->getDoctrine()->getManager(); 

    // this page is just used as the starting point to redirect the user to the appropriate page 
    if($user->getAttribute("user_data_set", 0) == 1) 
    { 
     //Get Symfony1 route from the user data table 
     $old_homepage = $user->getAttribute("user_homepage", "@default_homepage"); 
     //Convert route to Symfony2 format 
     $new_homepage = $this->setForwardingAddress($old_homepage); 

     return $this->redirect($this->generateUrl($new_homepage)); 
    } 
    else 
    { 
     return $this->redirect('login'); 
    }   


} 

Как я могу изменить глобальный вместо локальной ссылки?

+1

Если вы не хотите сохранять его в БД, почему вы не используете сеанс для хранения атрибутов? – lsouza

+0

@lsouza Я имею дело с большим количеством устаревшего кода. Я обновляю наш сайт с Symfony 1.4 до 2.5. Унаследованный код имеет встроенные функции getAttribute/setAttribute в классе User. Унаследованный код имеет расширенный пользовательский класс, который устанавливает атрибуты пользователя и обрабатывает запросы к базе данных. Я попытался подражать этому, создав репозиторий пользователей. Было бы плохой идеей установить переменные сеанса из репозитория? –

+1

Вместо репозитория вы можете создать службу UserManager и решить все, что вам нужно, от сеанса jandling до пользовательских операций. Репозиторий очень полезен, но должен иметь дело только с базой данных. – lsouza

ответ

1

Вы, очевидно, хотите получить кросс-запрос, поэтому вам нужно будет использовать DB или session.

Например:

// Injecting Session service 
public function __construct(Session $session){ 
    $this->session = $session 
} 

public function onAuthenticationSuccess(Request $request, TokenInterface $token) 
{ 
    $this->session->set('user_data_set', 1); 
} 

А затем в контроллере:

$foo = $session->get('user_data_set'); 

Является ли это то, что вы хотели?

+0

Спасибо за ответ. Это решение, с которым я пошел. По сути, это мой старый код. –

Смежные вопросы