Skip to content

Commit 2d7393a

Browse files
committed
minor #20956 [Routing] Tell about {foo:bar} mapping syntax (nicolas-grekas)
This PR was merged into the 7.2 branch. Discussion ---------- [Routing] Tell about `{foo:bar}` mapping syntax Fix #20806 Fix #19846 Fix #19848 Replaces #19869 Replaces #20812 Commits ------- e591c59 [Routing] Tell about {foo:bar} mapping syntax
2 parents fe5cf5e + e591c59 commit 2d7393a

File tree

2 files changed

+43
-31
lines changed

2 files changed

+43
-31
lines changed

doctrine.rst

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -680,7 +680,7 @@ will automatically fetch them::
680680
/**
681681
* Perform a findOneBy() where the slug property matches {slug}.
682682
*/
683-
#[Route('/product/{slug}')]
683+
#[Route('/product/{slug:product}')]
684684
public function showBySlug(Product $product): Response
685685
{
686686
}
@@ -694,14 +694,17 @@ Automatic fetching works in these situations:
694694
*all* of the wildcards in your route that are actually properties
695695
on your entity (non-properties are ignored).
696696

697-
This behavior is enabled by default on all controllers. If you prefer, you can
698-
restrict this feature to only work on route wildcards called ``id`` to look for
699-
entities by primary key. To do so, set the option
700-
``doctrine.orm.controller_resolver.auto_mapping`` to ``false``.
697+
The ``{slug:product}`` syntax maps the route parameter named ``slug`` to the
698+
controller argument named ``$product``. It also hints the resolver to lookup
699+
by slug when loading the corresponding ``Product`` object from the database.
701700

702-
When ``auto_mapping`` is disabled, you can configure the mapping explicitly for
703-
any controller argument with the ``MapEntity`` attribute. You can even control
704-
the ``EntityValueResolver`` behavior by using the `MapEntity options`_ ::
701+
.. versionadded:: 7.1
702+
703+
Route parameter mapping was introduced in Symfony 7.1.
704+
705+
You can also configure the mapping explicitly for any controller argument
706+
with the ``MapEntity`` attribute. You can even control the
707+
``EntityValueResolver`` behavior by using the `MapEntity options`_ ::
705708

706709
// src/Controller/ProductController.php
707710
namespace App\Controller;
@@ -812,18 +815,6 @@ control behavior:
812815
): Response {
813816
}
814817

815-
``exclude``
816-
Configures the properties that should be used in the ``findOneBy()``
817-
method by *excluding* one or more properties so that not *all* are used::
818-
819-
#[Route('/product/{slug}/{date}')]
820-
public function show(
821-
#[MapEntity(exclude: ['date'])]
822-
Product $product,
823-
\DateTime $date
824-
): Response {
825-
}
826-
827818
``stripNull``
828819
If true, then when ``findOneBy()`` is used, any values that are
829820
``null`` will not be used for the query.

routing.rst

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ Creating Routes as Attributes
2222
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2323

2424
PHP attributes allow to define routes next to the code of the
25-
:doc:`controllers </controller>` associated to those routes. Attributes are
26-
native in PHP 8 and higher versions, so you can use them right away.
25+
:doc:`controllers </controller>` associated to those routes.
2726

2827
You need to add a bit of configuration to your project before using them. If your
2928
project uses :ref:`Symfony Flex <symfony-flex>`, this file is already created for you.
@@ -707,12 +706,6 @@ URL Route Parameters
707706
matches any uppercase character in any language, ``\p{Greek}`` matches any
708707
Greek characters, etc.
709708

710-
.. note::
711-
712-
When using regular expressions in route parameters, you can set the ``utf8``
713-
route option to ``true`` to make any ``.`` character match any UTF-8
714-
characters instead of just a single byte.
715-
716709
If you prefer, requirements can be inlined in each parameter using the syntax
717710
``{parameter_name<requirements>}``. This feature makes configuration more
718711
concise, but it can decrease route readability when requirements are complex:
@@ -998,7 +991,7 @@ controller action. Instead of ``string $slug``, add ``BlogPost $post``::
998991
{
999992
// ...
1000993

1001-
#[Route('/blog/{slug}', name: 'blog_show')]
994+
#[Route('/blog/{slug:post}', name: 'blog_show')]
1002995
public function show(BlogPost $post): Response
1003996
{
1004997
// $post is the object whose slug matches the routing parameter
@@ -1012,9 +1005,37 @@ this case), the "param converter" makes a database request to find the object
10121005
using the request parameters (``slug`` in this case). If no object is found,
10131006
Symfony generates a 404 response automatically.
10141007

1008+
The ``{slug:post}`` syntax maps the route parameter named ``slug`` to the controller
1009+
argument named ``$post``. It also hints the "param converter" to lookup by slug
1010+
when loading the corresponding ``BlogPost`` object from the database.
1011+
1012+
.. versionadded:: 7.1
1013+
1014+
Route parameter mapping was introduced in Symfony 7.1.
1015+
1016+
When more than one entity needs to be derived from route parameters, collisions can happen.
1017+
In the following example, the route tries to define two mappings: one to load an author by
1018+
name, two to load a category by name. But this is not allowed because from the side of the
1019+
route definition, this declares a parameter named "name" twice::
1020+
1021+
#[Route('/search-book/{name:author}/{name:category}')]
1022+
1023+
Such routes should instead be defined using the following syntax::
1024+
1025+
#[Route('/search-book/{authorName:author.name}/{categoryName:category.name}')]
1026+
1027+
This way, the route parameter names are unique (``authorName`` and ``categoryName``) and
1028+
the "param converter" can correctly map them to controller arguments (``$author`` and
1029+
``$category``), loading them both by their name.
1030+
1031+
.. versionadded:: 7.3
1032+
1033+
This more advanced style of route parameter mapping was introduced in Symfony 7.3.
1034+
1035+
More advanced mappings can be achieved using the ``#[MapEntity]`` attribute.
10151036
Check out the :ref:`Doctrine param conversion documentation <doctrine-entity-value-resolver>`
1016-
to learn about the ``#[MapEntity]`` attribute that can be used to customize the
1017-
database queries used to fetch the object from the route parameter.
1037+
to learn how to customize the database queries used to fetch the object from the route
1038+
parameter.
10181039

10191040
Backed Enum Parameters
10201041
~~~~~~~~~~~~~~~~~~~~~~

0 commit comments

Comments
 (0)