Метод loadUserByIdentifier
Метод loadUserByIdentifier принадлежит классу UserProvider и загружает объект пользователя по его уникальному идентификатору. Первым параметром передаётся строка $identifier - это может быть email, логин или другое уникальное поле. Если пользователь найден, метод возвращает объект UserInterface, иначе выбрасывает исключение UserNotFoundException.
Синтаксис
public function loadUserByIdentifier(string $identifier): UserInterface
Пример
Давайте создадим класс UserProvider, который загружает пользователя по email из базы данных:
<?php
namespace App\Security;
use App\Entity\User;
use App\Repository\UserRepository;
use Symfony\Component\Security\Core\Exception\UserNotFoundException;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
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
{
return $this->loadUserByIdentifier($user->getUserIdentifier());
}
public function supportsClass(string $class): bool
{
return $class === User::class;
}
}
?>
Пример
Давайте используем метод loadUserByIdentifier для загрузки пользователя по логину:
<?php
namespace App\Controller;
use App\Security\UserProvider;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class UserController extends AbstractController
{
#[Route('/user/{identifier}', name: 'user_show')]
public function show(string $identifier, UserProvider $userProvider): Response
{
$user = $userProvider->loadUserByIdentifier($identifier);
return new Response('User: ' . $user->getUserIdentifier());
}
}
?>
Результат выполнения кода для адреса /user/abcde:
"User: abcde"
Пример
Давайте обработаем исключение UserNotFoundException, если пользователь не найден:
<?php
namespace App\Controller;
use App\Security\UserProvider;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Core\Exception\UserNotFoundException;
class UserController extends AbstractController
{
#[Route('/user/{identifier}', name: 'user_show')]
public function show(string $identifier, UserProvider $userProvider): Response
{
try {
$user = $userProvider->loadUserByIdentifier($identifier);
return new Response('User: ' . $user->getUserIdentifier());
} catch (UserNotFoundException $e) {
return new Response('User not found', 404);
}
}
}
?>
Результат выполнения кода для адреса /user/unknown:
"User not found"
Смотрите также
-
класс
UserProvider,
который загружает пользователей из хранилища -
метод
refreshUser,
который обновляет объект пользователя -
метод
supportsClass,
который проверяет поддержку класса пользователя -
класс
UserBadge,
который хранит идентификатор пользователя