将用户作为依赖项注入参数传递 - symfony 4
Pass user in argument as dependence injection - symfony4
Error: "Cannot resolve argument $experienceCalculator of "App\Controller\StudyActivityController::create()": Cannot autowire service "App\Service\ExperienceCalculator": argument "$user" of method "__construct()" references interface "Symfony\Component\Security\Core\User\UserInterface" but no such service exists. Did you create a class that implements this interface?"
我正在开发一个 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;
}
所以我所做的是在配置中添加一个别名,这样服务就知道传递了哪个 class,这有效但没有填充用户。
# config/services.yaml
App\Entity\User: ~
Symfony\Component\Security\Core\User\UserInterface: '@App\Entity\User'
我不知道这是否相关,但我正在使用这个包 LexikJWTAuthenticationBundle 来验证用户。
自动装配像用户这样的实体不是一个好的做法,因为可能有
当前没有登录用户或根本没有用户。
相反,您应该使用始终存在的服务来检查是否有登录用户,然后接收它。例如 Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface
.
你可以通过token的getToken method of the tokenstorage and then retrieve the current user with the getUser method获取当前token,像这样:
$user = $tokenStorage->getToken() ? $tokenStorage->getToken()->getUser() : null;
你仍然通过自动装配让用户进入你的控制器的原因是在 Symfony 3.2 中添加的用户解析器 described in this blog post
Error: "Cannot resolve argument $experienceCalculator of "App\Controller\StudyActivityController::create()": Cannot autowire service "App\Service\ExperienceCalculator": argument "$user" of method "__construct()" references interface "Symfony\Component\Security\Core\User\UserInterface" but no such service exists. Did you create a class that implements this interface?"
我正在开发一个 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;
}
所以我所做的是在配置中添加一个别名,这样服务就知道传递了哪个 class,这有效但没有填充用户。
# config/services.yaml
App\Entity\User: ~
Symfony\Component\Security\Core\User\UserInterface: '@App\Entity\User'
我不知道这是否相关,但我正在使用这个包 LexikJWTAuthenticationBundle 来验证用户。
自动装配像用户这样的实体不是一个好的做法,因为可能有 当前没有登录用户或根本没有用户。
相反,您应该使用始终存在的服务来检查是否有登录用户,然后接收它。例如 Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface
.
你可以通过token的getToken method of the tokenstorage and then retrieve the current user with the getUser method获取当前token,像这样:
$user = $tokenStorage->getToken() ? $tokenStorage->getToken()->getUser() : null;
你仍然通过自动装配让用户进入你的控制器的原因是在 Symfony 3.2 中添加的用户解析器 described in this blog post