Метод контроллера Symfony не распознает переданную переменную

Я передаю некоторые переменные в метод контроллера. Однако последний не распознается, хотя сброс переменной на стороне ветки подтверждает, что переменная имеет значение нет null.

Код контроллера

/**
     * @Route(name = "course_space_view", path = "/courseSpace/{courseSpaceId}/about", methods = {"GET", "POST"})
     *
     * @ParamConverter("courseSpace", class = "AppBundle\Entity\CourseSpace")
     * @ParamConverter("listSettings", class = "AppBundle\View\ListEnrollment\ListSettings", options = {"activeTab" = ListSettings::ABOUT_TAB})
     *
     * @param ListSettings $listSettings
     * @param CourseSpace $courseSpace
     * @param bool $provisionalTerm
     *
     * @return  Response
     */
    public function viewCourseSpace(ListSettings $listSettings, CourseSpace $courseSpace, bool $provisionalTerm)
    {
        $this->denyAccessUnlessGranted(CourseSpaceVoter::READ, $courseSpace);

        return $this->render('/LandingPage/CourseSpaces/aboutCourseSpace.html.twig',
            [
                'courseSpace' => $courseSpace,
                'listSettings' => $listSettings
            ]
        );
    }

Шаблон Twig, который передает переменные

<a class = "btn btn-sm btn-light"
   href = "{{ path('course_space_view', {'courseSpaceId': tile.courseSpaceId, 'provisionalTerm': tile.term.provisionable}) }}">
     <span class = "fas fa-cog mr-1"></span>
     Manage course space
</a>

Ничто в конфигурации пути вашего маршрута не намекает на provisionalTerm. Наверное поэтому не читается. Можете ли вы проверить, какой URL генерируется в вашем шаблоне? Вероятно, вам следует либо добавить переменную к пути, например. .../about/{provisionalTerm} или иметь ParamConverter или ArgumentResolver, которые извлекают значение из дополнительных параметров запроса, например. с чем-то вроде $request->query->get('provisionalTerm') и передает его действию контроллера.

dbrumann 24.06.2019 23:32

@dbrumann нет ли способа передать переменную без ее отображения в URL-адресе? В идеале я хотел бы показывать только идентификатор в URL-адресе.

d1596 24.06.2019 23:34

Я согласен с @dbrumann. Как выглядит сгенерированный URL? Если вы действительно хотите передать provisionalTerm своему контроллеру (хотя в вашем контроллере нет никаких признаков этого), то как насчет добавления ?provisionalTerm = {{ tile.term.provisional}} после термина path() в вашем определении href.

ehymel 25.06.2019 03:02

Вам не нужно помещать его вручную после пути, каждый параметр, который не улавливается в определении маршрута, автоматически добавляется в конец URL-адреса. Затем вы получаете их из запроса.

Yoann MIR 25.06.2019 10:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
164
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если вы не определяете provisionalTerm в своем пути маршрута, например:

path = "/courseSpace/{courseSpaceId}/about/{provisionalTerm}"

Symfony добавит ваш параметр (и любой другой, не определенный в пути маршрута) в конце URL-адреса следующим образом:

/courseSpace/116168444546/about?provisionalTerm=1

Затем вы можете получить их из запроса.

/**
         * @Route(name = "course_space_view", path = "/courseSpace/{courseSpaceId}/about", methods = {"GET", "POST"})
         *
         * @ParamConverter("courseSpace", class = "AppBundle\Entity\CourseSpace")
         * @ParamConverter("listSettings", class = "AppBundle\View\ListEnrollment\ListSettings", options = {"activeTab" = ListSettings::ABOUT_TAB})
         *
         * @param ListSettings $listSettings
         * @param CourseSpace $courseSpace
         * @param bool $provisionalTerm
         *
         * @return  Response
         */
        public function viewCourseSpace(Request $request, ListSettings $listSettings, CourseSpace $courseSpace)
        {
            $this->denyAccessUnlessGranted(CourseSpaceVoter::READ, $courseSpace);
            $provisionnalTerm = $request->query->get('provisionalTerm');
            return $this->render('/LandingPage/CourseSpaces/aboutCourseSpace.html.twig',
                [
                    'courseSpace' => $courseSpace,
                    'listSettings' => $listSettings
                ]
            );
        }

Если у вас нет специального преобразователя аргументов, параметры запроса не сопоставляются с аргументами вызываемого контроллера (метода).

xabbuh 25.06.2019 14:25

Итак, нет ли способа передать переменную маршруту контроллера и не отображать ее в маршруте? Кроме использования скрытого поля данных через HTML и JavaScript?

d1596 25.06.2019 18:08

У вас может быть значение по умолчанию, поэтому вам нужно будет передать его только тогда, когда значение отличается

Yoann MIR 26.06.2019 08:56

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