错误:“无法解析“ App \ Controller \ StudyActivityController :: create()的参数$ experienceCalculator”:无法自动装配服务“ App \ Service \ ExperienceCalculator”:方法“ __construct()”的参数“ $ user”引用了接口“ Symfony \ Component \ 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 :(得分:1)
像用户一样自动装配实体不是一个好习惯,因为可能存在 当前没有登录用户或根本没有用户。
相反,您应该使用一个始终存在的服务来检查是否有已登录的用户,然后接收它。例如Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface
。
您可以使用令牌存储中的getToken method获取当前令牌,然后使用令牌中的getUser method来检索当前用户,如下所示:
$user = $tokenStorage->getToken() ? $tokenStorage->getToken()->getUser() : null;
您仍然可以通过自动装配将用户吸引到控制器中的原因是在Symfony 3.2中将用户解析器添加为described in this blog post