Symfony пренасочва към маршрут, предаващ url slug

Търсих това в SO преди, но изглежда, че единствените дадени отговори са, когато параметрите се предават като низ на заявка, което не е това, което искам.

Имам страница в моя Symfony 3 CRM с маршрут app_litter. Има задължителен URL slug, наречен litter_id, който трябва да бъде предаден на маршрута, за да се определи кои данни за котилото да се показват, както следва:

/котило/1

Дефиницията на маршрута ми във файла за маршрутизиране е:

app_view_litter:
    path: /litter/{id}
    defaults: { _controller: AppBundle:Litter:view, id: null }
    requirements:
        id: \d+

Има функция, която позволява на потребителя да добавя кученца към котилото си, което е форма извън тази страница - след като кученцата бъдат успешно запазени, искам да пренасоча потребителя обратно към въпросното котило, така че направих това:

return $this->redirectToRoute('app_litter', array('litter_id' => $litter->getId()));

Където $litter е обектът, извлечен от Symfony. Това обаче пренасочва към:

/катило?катило_id=1

Което не работи, тъй като очаква плужек. Възможно ли е да се използва redirectToRoute() (или друг метод) за изобразяване на маршрута с охлюв вместо низ на заявка?


person Michael Emerson    schedule 18.01.2017    source източник
comment
Покажете дефиницията на вашия маршрут.   -  person Boris Guéry    schedule 18.01.2017
comment
@BorisGuéry го добави към въпроса.   -  person Michael Emerson    schedule 18.01.2017


Отговори (2)


Тъй като вашата дефиниция на маршрута е:

app_view_litter:
    path: /litter/{id}
    defaults: { _controller: AppBundle:Litter:view, id: null }
    requirements:
        id: \d+

Когато използвате генератора на маршрути, трябва да предоставите свързан масив с ключове, съответстващи на името на вашите контейнери, което във вашия случай е id.

Следователно трябва да бъде:

$this->redirectToRoute('app_litter', array('id' => $litter->getId()));

Ако искате да използвате slug и там нещо, което не се състои само от цифри (\d+), трябва или да дефинирате нов маршрут, или да промените съществуващия.

app_view_litter_using_slug:
    path: /litter/{slug}
    defaults: { _controller: AppBundle:Litter:view, slug: null }
    requirements:
        id: .*

А ти нещо като:

$this->redirectToRoute('app_litter_using_slug', array('slug' => $litter->getSlug()));

person Boris Guéry    schedule 18.01.2017
comment
Хм, добре, пропуснах това - но дори и да използвам litter?id=1, пак се проваля, защото смята, че id е нула. Грешката е Извикване на членска функция getBlah() на null - person Michael Emerson; 18.01.2017
comment
Защо бихте използвали litter?id=1, когато пътят ви трябва да е litter/1? Бихте ли предоставили пълния код за действие - person OlivierC; 18.01.2017
comment
@MichaelEmerson вероятно се проваля, защото не трябва да съответства на никакви валидни маршрути, /litter?id={id} не съответства на /litter/{id} с вашето действително изискване. - person Boris Guéry; 18.01.2017
comment
@BorisGuéry Да, знам, че се проваля поради това! Ето защо зададох въпроса как да го предам като slug в URL адреса! - person Michael Emerson; 18.01.2017
comment
@MichaelEmerson, редактирано. Въпреки това, всъщност ви съветвам да разгледате задълбочено как работи компонентът Routing . - person Boris Guéry; 18.01.2017

Възможно ли е да използвате грешен маршрут? Опитайте да използвате app_view_litter вместо app_litter:

return $this->redirectToRoute('app_view_litter', array('id' => $litter->getId()));
person lordrhodos    schedule 18.01.2017
comment
Не, маршрутът не е грешен. Това е индивидуалната страница, а не списъкът на всички кучила. - person Michael Emerson; 18.01.2017
comment
както посочи Борис, трябва да използвате id като параметър и гледайки дефиницията на маршрута, името на маршрута трябва да бъде app_view_litter. Ще актуализирам отговора. - person lordrhodos; 18.01.2017
comment
Това все още не работи. Въпросът, който се опитвам да разбера, е, че той го предава обратно като низ на заявка, а не като охлюв в URL адреса. - person Michael Emerson; 18.01.2017
comment
това звучи като маршрут, който съответства на повикването, където този параметър не е дефиниран. Така че, ако генерирате URL адреса с извикването отгоре, ще бъдете пренасочени към /litter?id={id}? Има ли други маршрути, конфигурирани за термина litter? - person lordrhodos; 18.01.2017