Ошибка: «Невозможно разрешить аргумент $ 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 аутентифицировать пользователя.
Автосоединение сущностей, таких как пользователь, не является хорошей практикой, поскольку
в настоящее время нет вошедшего в систему пользователя или нет пользователя вообще.
Вместо этого вы должны использовать сервис, который всегда существует, чтобы проверить, есть ли вошедший в систему пользователь, а затем получить его. Например, Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface
,
Вы можете получить текущий токен с помощью метод getToken токена, а затем получить текущего пользователя с метод getUser токена вот так:
$user = $tokenStorage->getToken() ? $tokenStorage->getToken()->getUser() : null;
Причиной, по которой вы, тем не менее, получаете пользователя в свой контроллер с помощью автоматической разводки, является преобразователь пользователя, добавленный в Symfony 3.2 описано в этом блоге
Других решений пока нет …