Простая, но глупая проблема блокирует меня на symfony сегодня вечером... Мне нужно использовать класс UserInterface компонента безопасности для получения информации о текущем пользователе. Однако symfony говорит мне, что этого класса не существует. Я проверил, что "безопасность" хорошо установлена и пути хорошие...
Мой код:
<?php
namespace App\Controller;
use App\Entity\Profile;
use App\Entity\Candidature;
use App\Form\CandidatureType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class CandidateController extends AbstractController
{
/**
* @Route("/candidate", name = "candidate")
*/
public function new(Request $request, UserInterface $user): Response
{
// NEED TO BE CONNECTED !!
if ($user->getUsername()) {
// SOME CODE ...........
} else {
return $this->redirectToRoute('security_login');
}
}
}

Я получаю ошибку (цитата)
Не удается автоматически связать аргумент $user of "App\Controller\CandidateController::new()": ссылается на интерфейс "Symfony\Component\Security\Core\User\UserInterface", но такого нет сервис есть. Вы создали класс, который реализует этот интерфейс?

Механизмы автосвязывания работают только для сервисов, а UserInterface — это не сервис, это просто контракт, обеспечивающий базовую безопасность Symfony.
Если вы хотите получить текущего пользователя, вы должны внедрить класс Symfony\Component\Security\Core\Securityсм. документацию
Поскольку они находятся внутри AbstractController, простой $this->getUser() также будет работать.
Это правда 👍🏽
В config/services.yml
services:
App\Controller\CandidateController:
arguments:
$user: '@Symfony\Component\Security\Core\User'
-Добавить для $user реальный класс:
-Вы также можете переместить эту проверку в сам класс обслуживания и ввести этот $user внутри класса обслуживания.
Обновлено:
Обратите внимание на это решение, если вы хотите переключаться между различными пользовательскими компонентами в будущем и сейчас.
Нет обслуживания пользователей. А если бы был, то автопроводка работала бы нормально. Сделайте тестовый проект и убедитесь сами.
@Cerad Я имел в виду, что ему нужно создать его самостоятельно, я знаю, что автоматическая проводка должна работать нормально, но я подумал, что ему нужно передать другой компонент «Безопасность пользователя».
Ну да. Им необходимо пройти службу безопасности. Вот почему ваш ответ просто неверен. Кроме того, ваш код использует инъекцию конструктора, что также просто неправильно для этого конкретного вопроса. Двойной удар.
Если вы используете Symfony 5.2+, то есть новый атрибут PHP под названием CurrentUser, который позволит вашему коду работать.