将用户参数作为依赖注入传递给 - 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();
}

似乎自动连线在传入服务的构造函数时找不到用户界面。

// src/Service/ExperienceCalculator.php
public function __construct(
StudyTimeRepository $studyTimeRepository,
UserInterface $user
)
{
$this->studyTimeRepository = $studyTimeRepository;
$this->user = $user;
}

所以我所做的是在配置中添加一个别名,以便服务知道传递了哪个类,该类有效但未填充用户。

# config/services.yaml
AppEntityUser: ~
SymfonyComponentSecurityCoreUserUserInterface: '@AppEntityUser'

我不知道这是否相关,但我正在使用这个捆绑包 LexikJWTAuthenticationBundle 来验证用户。

像用户这样的自动布线实体不是一个好的做法,因为可能存在 当前没有登录用户或根本没有用户。

相反,您应该使用始终存在的服务来检查是否有登录用户,然后接收它。例如SymfonyComponentSecurityCoreAuthenticationTokenStorageTokenStorageInterface.

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

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

尽管如此,您仍然通过自动连线将用户放入控制器的原因是Symfony 3.2中添加的用户解析器,如本博客文章中所述

最新更新