Я разветвил библиотеку и сделал много изменений в ней.Когда я выполнил авторизацию с Steam, он правильно сохраняет данные в базе данных, и я получаю сообщение об ошибке типа «Вызов функции-члена getUsername () при нулевом значении»
Из токена TokenInterface $, я могунапечатайте с $ token-> getUser (), он работает правильно.Я застрял действительно не знаю, где проблема.Я дам вам некоторые подозрительные коды, которые могут содержать ошибки.
security.yaml
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
anonymous: ~
pattern: ^/
provider: steam_user_provider
steam: true
logout:
path: /logout
target: /
user.php
public function __construct()
{
$this->roles = [];
}
/**
* @return array
*/
public function getRoles(): array
{
$roles = [];
foreach ($this->roles as $role) {
$roles[] = new Role($role);
}
return $roles;
}
SteamProvider
class SteamProvider implements AuthenticationProviderInterface
{
/**
* @var UserProviderInterface
*/
private $userProvider;
/**
* @param UserProviderInterface $userProvider
*/
public function __construct(UserProviderInterface $userProvider)
{
$this->userProvider = $userProvider;
}
/**
* {@inheritdoc}
*/
public function authenticate(TokenInterface $token)
{
$user = $this->userProvider->loadUserByUsername($token->getUsername());
$authenticatedToken = new SteamUserToken();
$authenticatedToken->setUser($user);
$authenticatedToken->setUsername($user->getUsername());
$authenticatedToken->setAuthenticated(true);
return $authenticatedToken;
}
/**
* {@inheritdoc}
*/
public function supports(TokenInterface $token)
{
return $token instanceof SteamUserToken;
}
}
ContextListener.(Здесь появляется ошибка)
$token->setUser($refreshedUser);
if (null !== $this->logger) {
$context = ['provider' => \get_class($provider),
'username' => $refreshedUser->getUsername()];
foreach ($token->getRoles() as $role) {
if ($role instanceof SwitchUserRole) {
$context['impersonator_username'] = $role-
>getSource()->getUsername();
break;
}
}
Мне очень жаль, что этот запоздалый вопрос.Но я понятия не имею, почему происходит эта ошибка.Действительно, $ token-> getUser () работает отлично, но в provider-> refreshUser ($ token-> getUser ()) дает значение NULL. Возможно, есть ошибка с ролями, но на самом деле не знаю.Если вам нужно больше примеров о моем коде, просто спросите меня.Спасибо за помощь
Добавление SteamUserProvider для получения дополнительной информации
/**
* @var EntityManagerInterface
*/
private $entityManager;
/**
* @var SteamApiClient
*/
private $api;
/**
* @var string
*/
private $userClass;
/**
* @var UserFactory
*/
private $userFactory;
/**
* @param EntityManagerInterface $entityManager
* @param SteamApiClient $steamApiClient
* @param string $userClass
* @param UserFactory $userFactory
*/
public function __construct(
EntityManagerInterface $entityManager,
SteamApiClient $steamApiClient,
string $userClass,
UserFactory $userFactory
)
{
$this->entityManager = $entityManager;
$this->api = $steamApiClient;
$this->userClass = $userClass;
$this->userFactory = $userFactory;
}
/**
* {@inheritdoc}
*/
public function loadUserByUsername($username)
{
$user = $this->entityManager->getRepository($this->userClass)-
>findOneBy(['steamId' => $username]);
$userData = $this->api->loadProfile($username);
if (null === $user) {
$user = $this->userFactory->getFromSteamApiResponse($userData);
$this->entityManager->persist($user);
} else {
$user->update($userData);
}
$this->entityManager->flush();
return $user;
}
/**
* {@inheritdoc}
*/
public function refreshUser(UserInterface $user)
{
if (!$user instanceof SteamUserInterface) {
throw new UnsupportedUserException();
}
return $this->entityManager->getRepository($this->userClass)-
>findOneBy(['steamId' => $user->getSteamId()]);
}
/**
* {@inheritdoc}
*/
public function supportsClass($class)
{
return $class === $this->userClass;
}