Michael Emerson
Michael Emerson

Reputation: 1813

Symfony redirect to route passing url slug

I've searched this on SO previously, but it seems that the only answers given are when parameters are passed as a query string, which is not what I want.

I have a page in my Symfony 3 CRM with a route app_litter. There is a required URL slug called litter_id which needs to be passed to the route in order to determine which litter data to show, as follows:

/litter/1

My route definiton in the routing file is:

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

There is a function which allows a user to add puppies to their litter, which is a form outside of this page - once the puppies are successfully saved, I want to redirect the user back to the litter in question, so I did this:

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

Where $litter is the object retrieved from Symfony. However, this redirects to:

/litter?litter_id=1

Which does not work, as it expects a slug. Is it possible to use redirectToRoute() (or any other method) to render the route with a slug instead of a query string?

Upvotes: 0

Views: 3850

Answers (2)

Boris Guéry
Boris Guéry

Reputation: 47585

Because your route definition is:

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

When using the route generator you need to provide an associated array with keys corresponding to the name of your placeholders which is in your case id.

Therefore, it must be:

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

If you want to use a slug, and there something which not only composed of digits (\d+), you have to either define a new route or modify the existing.

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

And you something like:

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

Upvotes: 3

lordrhodos
lordrhodos

Reputation: 2745

Could it be that you are using the wrong route? Try using app_view_litter instead of app_litter:

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

Upvotes: 1

Related Questions