Я передаю некоторые переменные в метод контроллера. Однако последний не распознается, хотя сброс переменной на стороне ветки подтверждает, что переменная имеет значение нет 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>
@dbrumann нет ли способа передать переменную без ее отображения в URL-адресе? В идеале я хотел бы показывать только идентификатор в URL-адресе.
Я согласен с @dbrumann. Как выглядит сгенерированный URL? Если вы действительно хотите передать provisionalTerm своему контроллеру (хотя в вашем контроллере нет никаких признаков этого), то как насчет добавления ?provisionalTerm = {{ tile.term.provisional}} после термина path() в вашем определении href.
Вам не нужно помещать его вручную после пути, каждый параметр, который не улавливается в определении маршрута, автоматически добавляется в конец URL-адреса. Затем вы получаете их из запроса.






Если вы не определяете 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
]
);
}
Если у вас нет специального преобразователя аргументов, параметры запроса не сопоставляются с аргументами вызываемого контроллера (метода).
Итак, нет ли способа передать переменную маршруту контроллера и не отображать ее в маршруте? Кроме использования скрытого поля данных через HTML и JavaScript?
У вас может быть значение по умолчанию, поэтому вам нужно будет передать его только тогда, когда значение отличается
Ничто в конфигурации пути вашего маршрута не намекает на provisionalTerm. Наверное поэтому не читается. Можете ли вы проверить, какой URL генерируется в вашем шаблоне? Вероятно, вам следует либо добавить переменную к пути, например.
.../about/{provisionalTerm}или иметь ParamConverter или ArgumentResolver, которые извлекают значение из дополнительных параметров запроса, например. с чем-то вроде$request->query->get('provisionalTerm')и передает его действию контроллера.