Como recarregar seu usuário após mudanças no Symfony2

Ent√£o, cerca de uma semana atr√°s, fui questionado por que nossa entidade User n√£o tinha as fun√ß√Ķes adequadas depois que atualizamos as fun√ß√Ķes. Logo ficou claro que a sess√£o n√£o foi reiniciada, ent√£o o usu√°rio ainda tinha suas permiss√Ķes antigas at√© que voc√™ as for√ßasse a atualiz√°-las.

Depois de algumas pesquisas, descobri este exemplo:

protected function reloadUserPermissions()
{
$token
= new UsernamePasswordToken(
$this
->user,
null,
'main',
$this
->user->getRoles()
);

$this
->securityContext->setToken($token);
}

E então tudo estava bem, mas não parecia certo fazer toda essa lógica cada vez que algo mudava.

Depois de uma pesquisa mais extensa, descobri que o Symfony j√° tem uma solu√ß√£o integrada para este problema e √© chamada de “EquatableInterface”. Esta interface for√ßa voc√™ a implementar uma fun√ß√£o chamada “isEqualTo (UserInterface $ user)” esta fun√ß√£o permite que voc√™ verifique se um determinado valor de seu objeto de usu√°rio mudou e se assim for, ele recarregar√° seu token de usu√°rio.

class User implements EquatableInterface
{

...

public function isEqualTo(UserInterface $user)
{
if ($user instanceof User) {
// Check that the roles are the same, in any order
$isEqual
= count($this->getRoles()) == count($user->getRoles());
if ($isEqual) {
foreach($this->getRoles() as $role) {
$isEqual
= $isEqual && in_array($role, $user->getRoles());
}
}
return $isEqual;
}

return false;
}

Você pode usar qualquer campo vinculado ao seu usuário para forçar uma recarga, tudo o que você precisa retornar é falso e o usuário será recarregado.

fonte: http://api.symfony.com/2.6/Symfony/Component/Security/Core/User/EquatableInterface.html

Todas as minhas dicas foram movidas para o meu blog www.pix-art.be, ent√£o venha conferir!