0

错误:“无法解析“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来验证用户。

4

1 回答 1

2

像用户这样的自动装配实体不是一个好习惯,因为可能没有当前登录的用户或根本没有用户。

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

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

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

尽管如此,您仍然通过自动装配在控制器中获取用户的原因是 Symfony 3.2 中添加的用户解析器,如本博文中所述

于 2018-08-31T21:26:08.497 回答