Хобрук: Ваш путь к мастерству в программировании

Symfony и Doctrine ParamConverter используются из AbstractController

Я пытаюсь написать контроллер, который не расширяет классический Symfony AbstractController, и я хотел бы использовать ParamConverter внутри в качестве аннотации. Код контроллера следующий:

<?php

declare(strict_types=1);

namespace App\Controller\Chat;

use App\Entity\Message;
use App\Entity\User;
use App\Service\DeleteMessage;
use Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
use function assert;

final class MessageMarkAsDeletedController
{
    private DeleteMessage $deleteMessage;

    private Security $security;

    public function __construct(DeleteMessage $deleteMessage, Security $security)
    {
        $this->deleteMessage = $deleteMessage;
        $this->security      = $security;
    }

    /**
     * @Route("/message/{messageId}/remove", name="chat_message_mark_as_deleted", methods={"POST"})
     * @ParamConverter("message", class="App\Entity\Message", options={"id" = "messageId"})
     */
    public function markAsDeleted(Message $message) : JsonResponse
    {
        $user = $this->security->getUser();
        assert($user instanceof User);

        if (! ($message->getFromUser() === $user->getId())) {
            return new JsonResponse(['error' => 'You don\'t have permissions to delete this message'], 404);
        }

        if ($message->isDeleted()) {
            return new JsonResponse(['error' => 'The specified message has already been deleted'], 400);
        }

        $this->deleteMessage->delete($message);

        return new JsonResponse(['payload' => ['success' => true]], 204);
    }
}

Когда я отправляю код в gitlab, запускается конвейер, который выдает ошибку:

Symfony \ Component \ Config \ Exception \ LoaderLoadException: [Semantical Error] The annotation "@Sensio \ Bundle \ FrameworkExtraBundle \ Request \ ParamConverter" in method App \ Controller \ Chat \ MessageMarkAsDeletedController :: markAsDeleted () does not exist, or could not be auto-loaded in /app/config/routes/../../src/Controller/Chat (which is being imported from "/app/config/routes/api.yaml"). Make sure annotations are installed and enabled.

Вы хоть представляете, в чем проблема? У меня есть некоторые проблемы с пониманием того, как использовать ParamConverter, и в документации Symfony все примеры выполняются в классе контроллера, который расширяет AbstractController, и я думаю, что моя проблема с пониманием исходит оттуда.


Ответы:


1

вместо

use Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter;

(которого ИМХО не существует) вы должны использовать

use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;

как предложено на https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html

15.02.2021
  • Решил проблему, спс 16.02.2021

  • 2

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

    Убедитесь, что sensio/framework-extra-bundle не зарегистрирована в файле composer.json как зависимость require-dev, а как обычная зависимость require.

    Для верности можно попробовать переустановить бандл:

    composer remove sensio/framework-extra-bundle && composer require sensio/framework-extra-bundle

    14.02.2021
  • К сожалению, это не так, но спасибо за ваш вклад! 15.02.2021
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..