Метод refreshUser
Метод refreshUser принадлежит классу UserProvider
и вызывается Symfony после успешной аутентификации пользователя.
Он принимает объект пользователя, который был получен из сессии
или токена, и возвращает его актуальную версию из хранилища
(например, из базы данных). Это позволяет обновить данные
пользователя (роли, статус, пароль) без повторного входа в систему.
Если пользователь не найден, метод должен выбросить исключение
UnsupportedUserException. Если переданный класс пользователя
не поддерживается, также выбрасывается это исключение.
Синтаксис
public function refreshUser(UserInterface $user): UserInterface
Пример
Давайте создадим класс UserProvider, который реализует
интерфейс UserProviderInterface и обновляет пользователя
из базы данных:
<?php
namespace AppSecurity;
use AppEntityUser;
use AppRepositoryUserRepository;
use SymfonyComponentSecurityCoreExceptionUnsupportedUserException;
use SymfonyComponentSecurityCoreExceptionUserNotFoundException;
use SymfonyComponentSecurityCoreUserUserInterface;
use SymfonyComponentSecurityCoreUserUserProviderInterface;
class UserProvider implements UserProviderInterface
{
public function __construct(
private UserRepository $userRepository
) {
}
public function loadUserByIdentifier(string $identifier): UserInterface
{
$user = $this->userRepository->findOneBy(['email' => $identifier]);
if (!$user) {
throw new UserNotFoundException('User not found');
}
return $user;
}
public function refreshUser(UserInterface $user): UserInterface
{
if (!$user instanceof User) {
throw new UnsupportedUserException(
sprintf('Instances of "%s" are not supported.', get_class($user))
);
}
$refreshedUser = $this->userRepository->find($user->getId());
if (!$refreshedUser) {
throw new UserNotFoundException('User not found');
}
return $refreshedUser;
}
public function supportsClass(string $class): bool
{
return $class === User::class || is_subclass_of($class, User::class);
}
}
?>
Пример
Давайте вызовем метод refreshUser вручную в контроллере
и выведем обновлённые данные пользователя:
<?php
namespace AppController;
use AppSecurityUserProvider;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
use SymfonyComponentSecurityCoreSecurity;
class UserController extends AbstractController
{
#[Route('/user/refresh', name: 'user_refresh')]
public function refresh(Security $security, UserProvider $userProvider): Response
{
$user = $security->getUser();
$refreshedUser = $userProvider->refreshUser($user);
return new Response('User email: ' . $refreshedUser->getEmail());
}
}
?>
Результат выполнения кода:
"User email: user@example.com"
Смотрите также
-
класс
UserProvider,
который управляет загрузкой и обновлением пользователей -
метод
loadUserByIdentifier,
который загружает пользователя по идентификатору -
метод
supportsClass,
который проверяет поддержку класса пользователя -
класс
UserBadge,
который связывает пользователя с паспортом