Передача пользователя в качестве аргумента в виде зависимости - symfony4 - PullRequest
0 голосов
/ 31 августа 2018

Ошибка: «Не удается разрешить аргумент $ experienceCalculator для« App \ Controller \ StudyActivityController :: create () »: Невозможно автоматически подключить службу« App \ Service \ ExperienceCalculator »: аргумент« $ user »метода« __construct () »ссылается на интерфейс "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 для аутентификации пользователя.

1 Ответ

0 голосов
/ 01 сентября 2018

Автосоединение сущностей, таких как пользователь, не является хорошей практикой, поскольку В данный момент пользователь не вошел в систему или вообще не зарегистрирован.

Вместо этого вы должны использовать сервис, который всегда существует, чтобы проверить, есть ли вошедший в систему пользователь, а затем получить его. Например, Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface.

Вы можете получить текущий токен с помощью метода getToken токена, а затем получить текущего пользователя с помощью метода getUser токена следующим образом:

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

Причина, по которой вы тем не менее получаете пользователя в свой контроллер с помощью автоматической проводки, заключается в том, что пользовательский преобразователь добавлен в Symfony 3.2 как , описанный в этом сообщении в блоге

...