Symfony 2 describes how to use parameter converters to translate slugs to entities, but their example does not enforce the relationship between the two entities. Here’s their example:
/** * @Route("/blog/{date}/{slug}/comments/{comment_slug}") * @ParamConverter("post", options={"mapping": {"date": "date", "slug": "slug"}}) * @ParamConverter("comment", options={"mapping": {"comment_slug": "slug"}}) */ public function showAction(Post $post, Comment $comment) { }
Assuming that Post has id
and slug
attributes and that Comment has id
, post
, and slug
attributes, the above example does not require that the Post slug in the URL match the Comment’s Post. Here’s an example that requires that the Post and Comment are related:
/** * @Route("/blog/{post_date}/{post_slug}/comments/{slug}") * @ParamConverter("post", options={"mapping": {"post_date": "date", "post_slug": "slug"}}) */ public function showAction(Post $post, Comment $comment) { }
This example works because Post is processed first and because $post
is named the same as the Comment::$post
relationship. When it comes time to process the Comment, it attempts to use slug
and post
to find the Comment instead of just slug
. (No @ParamConverter
annotation is necessary for the Comment because the parameters are named the same as the attributes.) If $post
doesn’t match $comment->post
, a 404 is returned, no additional checks required.