繁体   English   中英

将参数传递给用户作为依赖注入-symfony4

[英]Pass user in argument as dependence injection - symfony4

错误:“无法解析“ 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对用户进行身份验证。

自动装配诸如用户之类的实体不是一个好习惯,因为当前可能没有登录用户,也可能根本没有用户。

相反,您应该使用一个始终存在的服务来检查是否有登录用户,然后再接收它。 例如, Symfony\\Component\\Security\\Core\\Authentication\\Token\\Storage\\TokenStorageInterface

您可以使用令牌存储的getToken 方法获取当前令牌,然后使用令牌的getUser方法检索当前用户,如下所示:

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

但是,您仍然可以通过自动装配将用户吸引到控制器中的原因是, 如本博文所述,在Symfony 3.2中添加了用户解析器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM