Интерфейс ядра безопасности Symfony не загружается

Простая, но глупая проблема блокирует меня на 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');
        }
    }
}

Интерфейс ядра безопасности Symfony не загружается

Я получаю ошибку (цитата)

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

Если вы используете Symfony 5.2+, то есть новый атрибут PHP под названием CurrentUser, который позволит вашему коду работать.

Cerad 26.12.2020 16:59
Сила классов Java: сравнение с языком C
Сила классов Java: сравнение с языком C
Абстракция" - это процесс упрощения сложных сущностей или концепций реального мира с целью их применения в форме программирования. В Java класс...
0
1
665
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Механизмы автосвязывания работают только для сервисов, а UserInterface — это не сервис, это просто контракт, обеспечивающий базовую безопасность Symfony. Если вы хотите получить текущего пользователя, вы должны внедрить класс Symfony\Component\Security\Core\Securityсм. документацию

Поскольку они находятся внутри AbstractController, простой $this->getUser() также будет работать.

Cerad 26.12.2020 14:51

Это правда 👍🏽

Smaïne 26.12.2020 15:45

В config/services.yml

services:
    App\Controller\CandidateController:
       arguments:
        $user: '@Symfony\Component\Security\Core\User'

-Добавить для $user реальный класс:

-Вы также можете переместить эту проверку в сам класс обслуживания и ввести этот $user внутри класса обслуживания.

Обновлено:

Обратите внимание на это решение, если вы хотите переключаться между различными пользовательскими компонентами в будущем и сейчас.

Нет обслуживания пользователей. А если бы был, то автопроводка работала бы нормально. Сделайте тестовый проект и убедитесь сами.

Cerad 26.12.2020 14:50

@Cerad Я имел в виду, что ему нужно создать его самостоятельно, я знаю, что автоматическая проводка должна работать нормально, но я подумал, что ему нужно передать другой компонент «Безопасность пользователя».

user1054508 27.12.2020 13:11

Ну да. Им необходимо пройти службу безопасности. Вот почему ваш ответ просто неверен. Кроме того, ваш код использует инъекцию конструктора, что также просто неправильно для этого конкретного вопроса. Двойной удар.

Cerad 27.12.2020 14:11

Другие вопросы по теме