@@ -39,8 +39,8 @@ your autoloader to load the Routing component::
3939
4040 use Symfony\Component\Routing\Matcher\UrlMatcher;
4141 use Symfony\Component\Routing\RequestContext;
42- use Symfony\Component\Routing\RouteCollection;
4342 use Symfony\Component\Routing\Route;
43+ use Symfony\Component\Routing\RouteCollection;
4444
4545 $route = new Route('/foo', ['_controller' => 'MyController']);
4646 $routes = new RouteCollection();
@@ -82,20 +82,24 @@ be thrown.
8282Defining Routes
8383~~~~~~~~~~~~~~~
8484
85- A full route definition can contain up to seven parts:
85+ A full route definition can contain up to eight parts:
8686
87- #. The URL path route. This is matched against the URL passed to the `RequestContext `,
88- and can contain named wildcard placeholders (e.g. ``{placeholders} ``)
89- to match dynamic parts in the URL.
87+ #. The URL pattern. This is matched against the URL passed to the
88+ ``RequestContext ``. It is not a regular expression, but can contain named
89+ wildcard placeholders (e.g. ``{slug} ``) to match dynamic parts in the URL.
90+ The component will create the regular expression from it.
9091
91- #. An array of default values. This contains an array of arbitrary values
92- that will be returned when the request matches the route.
92+ #. An array of default parameters. This contains an array of arbitrary values
93+ that will be returned when the request matches the route. It is used by
94+ convention to map a controller to the route.
9395
9496#. An array of requirements. These define constraints for the values of the
95- placeholders as regular expressions.
97+ placeholders in the pattern as regular expressions.
9698
97- #. An array of options. These contain internal settings for the route and
98- are the least commonly needed.
99+ #. An array of options. These contain advanced settings for the route and
100+ can be used to control encoding or customize compilation.
101+ See :ref: `routing-unicode-support ` below. You can learn more about them by
102+ reading :method: `Symfony\\ Component\\ Routing\\ Route::setOptions ` implementation.
99103
100104#. A host. This is matched against the host of the request. See
101105 :doc: `/routing/hostname_pattern ` for more details.
@@ -105,6 +109,10 @@ A full route definition can contain up to seven parts:
105109#. An array of methods. These enforce a certain HTTP request method (``HEAD ``,
106110 ``GET ``, ``POST ``, ...).
107111
112+ #. A condition, using the :doc: `/components/expression_language/syntax `.
113+ A string that must evaluate to ``true `` so the route matches. See
114+ :doc: `/routing/conditions ` for more details.
115+
108116Take the following route, which combines several of these ideas::
109117
110118 $route = new Route(
@@ -114,7 +122,8 @@ Take the following route, which combines several of these ideas::
114122 [], // options
115123 '{subdomain}.example.com', // host
116124 [], // schemes
117- [] // methods
125+ [], // methods
126+ 'context.getHost() matches "/(secure|admin).example.com/"' // condition
118127 );
119128
120129 // ...
@@ -138,19 +147,22 @@ When using wildcards, these are returned in the array result when calling
138147``match ``. The part of the path that the wildcard matched (e.g. ``2012-01 ``) is used
139148as value.
140149
141- .. tip ::
150+ A placeholder matches any character except slashes ``/ `` by default, unless you define
151+ a specific requirement for it.
152+ The reason is that they are used by convention to separate different placeholders.
142153
143- If you want to match all URLs which start with a certain path and end in an
144- arbitrary suffix you can use the following route definition::
154+ If you want a placeholder to match anything, it must be the last of the route::
145155
146- $route = new Route(
147- '/start/{suffix }',
148- ['suffix ' => ''],
149- ['suffix ' => '.*']
150- );
156+ $route = new Route(
157+ '/start/{required}/{anything }',
158+ ['required ' => 'default '], // should always be defined
159+ ['anything ' => '.*'] // explicit requirement to allow "/"
160+ );
151161
152- Using Prefixes
153- ~~~~~~~~~~~~~~
162+ Learn more about it by reading :ref: `routing/slash_in_parameter `.
163+
164+ Using Prefixes and Collection Settings
165+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
154166
155167You can add routes or other instances of
156168:class: `Symfony\\ Component\\ Routing\\ RouteCollection ` to *another * collection.
@@ -166,11 +178,12 @@ host to all routes of a subtree using methods provided by the
166178 $subCollection->add(...);
167179 $subCollection->addPrefix('/prefix');
168180 $subCollection->addDefaults([...]);
169- $subCollection->addRequirements([]);
170- $subCollection->addOptions([]);
171- $subCollection->setHost('admin .example.com');
181+ $subCollection->addRequirements([... ]);
182+ $subCollection->addOptions([... ]);
183+ $subCollection->setHost('{subdomain} .example.com');
172184 $subCollection->setMethods(['POST']);
173185 $subCollection->setSchemes(['https']);
186+ $subCollection->setCondition('context.getHost() matches "/(secure|admin).example.com/"');
174187
175188 $rootCollection->addCollection($subCollection);
176189
@@ -210,7 +223,7 @@ Generate a URL
210223
211224While the :class: `Symfony\\ Component\\ Routing\\ Matcher\\ UrlMatcher ` tries
212225to find a route that fits the given request you can also build a URL from
213- a certain route::
226+ a certain route with the :class: ` Symfony \\ Component \\ Routing \\ Generator \\ UrlGenerator ` ::
214227
215228 use Symfony\Component\Routing\Generator\UrlGenerator;
216229 use Symfony\Component\Routing\RequestContext;
@@ -260,7 +273,7 @@ when the route doesn't exist::
260273Load Routes from a File
261274~~~~~~~~~~~~~~~~~~~~~~~
262275
263- You've already seen how you can easily add routes to a collection right inside
276+ You've already seen how you can add routes to a collection right inside
264277PHP. But you can also load routes from a number of different files.
265278
266279The Routing component comes with a number of loader classes, each giving
@@ -347,7 +360,7 @@ The all-in-one Router
347360~~~~~~~~~~~~~~~~~~~~~
348361
349362The :class: `Symfony\\ Component\\ Routing\\ Router ` class is an all-in-one package
350- to quickly use the Routing component. The constructor expects a loader instance,
363+ to use the Routing component. The constructor expects a loader instance,
351364a path to the main route definition and some other settings::
352365
353366 public function __construct(
@@ -372,14 +385,17 @@ automatically in the background if you want to use it. A basic example of the
372385 ['cache_dir' => __DIR__.'/cache'],
373386 $requestContext
374387 );
375- $router->match('/foo/bar');
388+ $parameters = $router->match('/foo/bar');
389+ $url = $router->generate('some_route', ['parameter' => 'value']);
376390
377391.. note ::
378392
379393 If you use caching, the Routing component will compile new classes which
380394 are saved in the ``cache_dir ``. This means your script must have write
381395 permissions for that location.
382396
397+ .. _routing-unicode-support :
398+
383399Unicode Routing Support
384400~~~~~~~~~~~~~~~~~~~~~~~
385401
@@ -481,7 +497,7 @@ You can also include UTF-8 strings as routing requirements:
481497 * @Route(
482498 * "/category/{name}",
483499 * name="route2",
484- * requirements ={"default"= "한국어"},
500+ * defaults ={"name": "한국어"},
485501 * options={"utf8": true}
486502 * )
487503 */
@@ -494,10 +510,10 @@ You can also include UTF-8 strings as routing requirements:
494510
495511 # app/config/routing.yml
496512 route2 :
497- path : /default/{default }
498- defaults : { _controller: 'AppBundle:Default:default' }
499- requirements :
500- default : " 한국어"
513+ path : /category/{name }
514+ defaults :
515+ _controller : ' AppBundle:Default:default '
516+ name : ' 한국어'
501517 options :
502518 utf8 : true
503519
@@ -510,9 +526,9 @@ You can also include UTF-8 strings as routing requirements:
510526 xsi : schemaLocation =" http://symfony.com/schema/routing
511527 https://symfony.com/schema/routing/routing-1.0.xsd" >
512528
513- <route id =" route2" path =" /default/{default }" >
529+ <route id =" route2" path =" /category/{name }" >
514530 <default key =" _controller" >AppBundle:Default:default</default >
515- <requirement key =" default " >한국어</requirement >
531+ <default key =" name " >한국어</requirement >
516532 <option key =" utf8" >true</option >
517533 </route >
518534 </routes >
@@ -527,10 +543,9 @@ You can also include UTF-8 strings as routing requirements:
527543 $routes->add('route2', new Route('/default/{default}',
528544 [
529545 '_controller' => 'AppBundle:Default:default',
546+ 'name' => '한국어',
530547 ],
531- [
532- 'default' => '한국어',
533- ],
548+ [],
534549 [
535550 'utf8' => true,
536551 ]
0 commit comments