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

Ошибка: «Невозможно разрешить аргумент $ experienceCalculator для« App \ Controller \ StudyActivityController :: create () »: Невозможно автоматически подключить службу« App \ Service \ ExperienceCalculator »: аргумент« $ user »метода« __construct () »ссылается на интерфейс« Symfony \ » Компонент \ Security \ Core \ User \ UserInterface «, но такой службы не существует. Вы создали класс, который реализует этот интерфейс?»

Я работаю над API, и мне нужно получить доступ к пользователю в службе, которую я передаю в виде внедрения зависимостей в контроллер. Если я получаю доступ к пользователю в контроллере, он работает нормально, но в сервисе нет.

// src/Controller/StudyTimeController.php

public function create(
Request $request,
UserInterface $user,
ExperienceCalculator $experienceCalculator
)
{
$experienceCalculator->calculate();
}

Кажется, что автопроводка не находит UserInterface при передаче в конструктор службы.

// src/Service/ExperienceCalculator.php

public function __construct(
StudyTimeRepository $studyTimeRepository,
UserInterface $user
)
{
$this->studyTimeRepository = $studyTimeRepository;
$this->user = $user;
}

Поэтому я добавил псевдоним в конфигах, чтобы служба знала, какой класс был передан, что сработало, но пользователь не заполнен.

# config/services.yaml

App\Entity\User: ~
Symfony\Component\Security\Core\User\UserInterface: '@App\Entity\User'

Я не знаю, если это актуально, но я использую этот комплект LexikJWTAuthenticationBundle аутентифицировать пользователя.

0

Решение

Автосоединение сущностей, таких как пользователь, не является хорошей практикой, поскольку
в настоящее время нет вошедшего в систему пользователя или нет пользователя вообще.

Вместо этого вы должны использовать сервис, который всегда существует, чтобы проверить, есть ли вошедший в систему пользователь, а затем получить его. Например, Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface,

Вы можете получить текущий токен с помощью метод getToken токена, а затем получить текущего пользователя с метод getUser токена вот так:

$user = $tokenStorage->getToken() ? $tokenStorage->getToken()->getUser() : null;

Причиной, по которой вы, тем не менее, получаете пользователя в свой контроллер с помощью автоматической разводки, является преобразователь пользователя, добавленный в Symfony 3.2 описано в этом блоге

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]