diff --git a/controller/error_pages.rst b/controller/error_pages.rst
index f713b909035..fff0e307eac 100644
--- a/controller/error_pages.rst
+++ b/controller/error_pages.rst
@@ -157,7 +157,7 @@ automatically when installing ``symfony/framework-bundle``):
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
@@ -165,7 +165,7 @@ automatically when installing ``symfony/framework-bundle``):
.. code-block:: php
// config/routes/dev/framework.php
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->import('@FrameworkBundle/Resources/config/routing/errors.xml')
diff --git a/controller/service.rst b/controller/service.rst
index 77020bab590..d9dcbcfdef8 100644
--- a/controller/service.rst
+++ b/controller/service.rst
@@ -54,7 +54,7 @@ a service like: ``App\Controller\HelloController::index``:
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
@@ -64,7 +64,7 @@ a service like: ``App\Controller\HelloController::index``:
// config/routes.php
use App\Controller\HelloController;
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->add('hello', '/hello')
@@ -115,7 +115,7 @@ which is a common practice when following the `ADR pattern`_
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
app.hello_controller
diff --git a/routing.rst b/routing.rst
index f5647e85fa6..57c005aee0e 100644
--- a/routing.rst
+++ b/routing.rst
@@ -109,7 +109,7 @@ the ``BlogController``:
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
add('blog_list', '/blog')
@@ -193,7 +193,7 @@ Use the ``methods`` option to restrict the verbs each route should respond to:
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
add('api_post_show', '/api/posts/{id}')
@@ -282,7 +282,7 @@ arbitrary matching logic:
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
context.getMethod() in ['GET', 'HEAD'] and request.headers.get('User-Agent') matches '/firefox/i'
@@ -295,7 +295,7 @@ arbitrary matching logic:
// config/routes.php
use App\Controller\DefaultController;
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->add('contact', '')
@@ -429,7 +429,7 @@ defined as ``/blog/{slug}``:
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
@@ -439,7 +439,7 @@ defined as ``/blog/{slug}``:
// config/routes.php
use App\Controller\BlogController;
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->add('blog_show', '/blog/{slug}')
@@ -518,7 +518,7 @@ the ``{page}`` parameter using the ``requirements`` option:
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
\d+
@@ -532,7 +532,7 @@ the ``{page}`` parameter using the ``requirements`` option:
// config/routes.php
use App\Controller\BlogController;
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->add('blog_list', '/blog/{page}')
@@ -615,7 +615,7 @@ concise, but it can decrease route readability when requirements are complex:
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
@@ -627,7 +627,7 @@ concise, but it can decrease route readability when requirements are complex:
// config/routes.php
use App\Controller\BlogController;
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->add('blog_list', '/blog/{page<\d+>}')
@@ -690,7 +690,7 @@ other configuration formats they are defined with the ``defaults`` option:
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
1
@@ -705,7 +705,7 @@ other configuration formats they are defined with the ``defaults`` option:
// config/routes.php
use App\Controller\BlogController;
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->add('blog_list', '/blog/{page}')
@@ -769,7 +769,7 @@ parameter:
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
@@ -781,7 +781,7 @@ parameter:
// config/routes.php
use App\Controller\BlogController;
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->add('blog_list', '/blog/{page<\d+>?1}')
@@ -917,7 +917,7 @@ and in route imports. Symfony defines some special attributes with the same name
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
1
@@ -1006,7 +1006,7 @@ the controllers of the routes:
// config/routes.php
use App\Controller\BlogController;
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->add('blog_index', '/blog/{page}')
@@ -1066,7 +1066,7 @@ A possible solution is to change the parameter requirements to be more permissiv
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
.+
@@ -1077,7 +1077,7 @@ A possible solution is to change the parameter requirements to be more permissiv
// config/routes.php
use App\Controller\DefaultController;
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->add('share', '/share/{token}')
@@ -1175,7 +1175,7 @@ the common configuration using options when importing the routes.
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
+ permanent="true"
+
+ keepQueryParams="true">
+
+ keepRequestMethod="true">
index
current
-
- true
-
- true
-
- true
-
+
-
+
- https://legacy.example.com/doc
+ redirect-to-url="https://legacy.example.com/doc"
- true
-
+ permanent="true">
+
.. code-block:: php
// config/routes.php
use App\Controller\DefaultController;
- use Symfony\Bundle\FrameworkBundle\Controller\RedirectController;
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->add('doc_shortcut', '/doc')
- ->controller(RedirectController::class)
- ->defaults([
- 'route' => 'doc_page',
- // optionally you can define some arguments passed to the template
+ ->redirectToRoute('doc_page')
+
+ // redirections are temporary by default (code 302) but you can make them permanent (code 301)
+ ->permanent()
+
+ // add this to keep the original query string parameters when redirecting
+ ->keepQueryParams()
+
+ // add this to keep the HTTP method when redirecting. The redirect status changes:
+ // * for temporary redirects, it uses the 307 status code instead of 302
+ // * for permanent redirects, it uses the 308 status code instead of 301
+ ->keepRequestMethod()
+
+ // optionally you can define some arguments passed to the template
+ ->defaults([
'page' => 'index',
'version' => 'current',
- // redirections are temporary by default (code 302) but you can make them permanent (code 301)
- 'permanent' => true,
- // add this to keep the original query string parameters when redirecting
- 'keepQueryParams' => true,
- // add this to keep the HTTP method when redirecting. The redirect status changes:
- // * for temporary redirects, it uses the 307 status code instead of 302
- // * for permanent redirects, it uses the 308 status code instead of 301
- 'keepRequestMethod' => true,
])
;
$routes->add('legacy_doc', '/legacy/doc')
- ->controller(RedirectController::class)
- ->defaults([
- // this value can be an absolute path or an absolute URL
- 'path' => 'https://legacy.example.com/doc',
- // redirections are temporary by default (code 302) but you can make them permanent (code 301)
- 'permanent' => true,
- ])
+ // this value can be an absolute path or an absolute URL
+ ->redirectToUrl('https://legacy.example.com/doc')
+
+ // redirections are temporary by default (code 302) but you can make them permanent (code 301)
+ ->permanent()
;
};
+.. versionadded:: 5.1
+
+ This short syntax was introduced in Symfony 5.1. Before you had to
+ define the controller and specific route attributes using ``defaults``.
+
.. tip::
Symfony also provides some utilities to
:ref:`redirect inside controllers `
+Discarding Routes From Configuration
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Sometimes, you may want to discard a route from a vendor collection, or notify
+search engines that a page is gone:
+
+.. configuration-block::
+
+ .. code-block:: yaml
+
+ # config/routes.yaml
+ # if the same name was used by a route imported before it will be overridden
+ discarded_route:
+ path: /unwanted
+ gone: true
+ # gone routes are temporary by default (code 404) but you can make them permanent (code 410)
+ permanent: true
+
+ .. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+
+
+ .. code-block:: php
+
+ // config/routes.php
+ use App\Controller\DefaultController;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
+
+ return function (RoutingConfigurator $routes) {
+ // if the same name was used by a route imported before it will be overridden
+ $routes->add('discarded_route', '/unwanted')
+ ->gone()
+
+ // gone routes are temporary by default (code 404) but you can make them permanent (code 410)
+ ->permanent()
+ ;
+ };
+
+.. versionadded:: 5.1
+
+ This short syntax was introduced in Symfony 5.1. Before you had to
+ define the controller and specific route attributes using ``defaults``.
+
.. _routing-trailing-slash-redirection:
Redirecting URLs with Trailing Slashes
@@ -1477,7 +1536,7 @@ host name:
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
add('mobile_homepage', '/')
@@ -1566,7 +1625,7 @@ multi-tenant applications) and these parameters can be validated too with
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
add('mobile_homepage', '/')
@@ -1674,7 +1733,7 @@ avoids the need for duplicating routes, which also reduces the potential bugs:
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
/about-us
@@ -1686,7 +1745,7 @@ avoids the need for duplicating routes, which also reduces the potential bugs:
// config/routes.php
use App\Controller\CompanyController;
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->add('about_us', [
@@ -1729,7 +1788,7 @@ with a locale. This can be done by defining a different prefix for each locale
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
@@ -1741,7 +1800,7 @@ with a locale. This can be done by defining a different prefix for each locale
.. code-block:: php
// config/routes/annotations.php
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->import('../../src/Controller/', 'annotation')
@@ -2098,7 +2157,7 @@ each route explicitly:
// config/routes.php
use App\Controller\SecurityController;
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->add('login', '/login')
@@ -2147,7 +2206,7 @@ defined as annotations:
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
HTTPS
@@ -2157,7 +2216,7 @@ defined as annotations:
.. code-block:: php
// config/routes/annotations.php
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->import('../../src/Controller/', 'annotation')
diff --git a/routing/custom_route_loader.rst b/routing/custom_route_loader.rst
index 8a66b15e38f..89cf108a5a2 100644
--- a/routing/custom_route_loader.rst
+++ b/routing/custom_route_loader.rst
@@ -46,7 +46,7 @@ Symfony provides several route loaders for the most common needs:
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
@@ -64,7 +64,7 @@ Symfony provides several route loaders for the most common needs:
.. code-block:: php
// config/routes.php
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
// loads routes from the given routing file stored in some bundle
@@ -138,7 +138,7 @@ Take these lines from the ``routes.yaml``:
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
@@ -146,7 +146,7 @@ Take these lines from the ``routes.yaml``:
.. code-block:: php
// config/routes.php
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->import('../src/Controller', 'annotation');
@@ -192,7 +192,7 @@ and configure the service and method to call:
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
@@ -200,7 +200,7 @@ and configure the service and method to call:
.. code-block:: php
// config/routes.php
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->import('admin_route_loader::loadRoutes', 'service');
@@ -370,7 +370,7 @@ What remains to do is adding a few lines to the routing configuration:
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
@@ -378,7 +378,7 @@ What remains to do is adding a few lines to the routing configuration:
.. code-block:: php
// config/routes.php
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->import('.', 'extra');
diff --git a/security.rst b/security.rst
index ec7c17dcb29..38a8b2ba5c7 100644
--- a/security.rst
+++ b/security.rst
@@ -855,7 +855,7 @@ Next, you'll need to create a route for this URL (but not a controller):
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
@@ -863,7 +863,7 @@ Next, you'll need to create a route for this URL (but not a controller):
.. code-block:: php
// config/routes.php
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->add('logout', '/logout')
diff --git a/security/form_login.rst b/security/form_login.rst
index f7763ce8094..76713414a19 100644
--- a/security/form_login.rst
+++ b/security/form_login.rst
@@ -122,7 +122,7 @@ configuration (``login``):
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
@@ -131,7 +131,7 @@ configuration (``login``):
// config/routes.php
use App\Controller\SecurityController;
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->add('login', '/login')
diff --git a/security/json_login_setup.rst b/security/json_login_setup.rst
index 060821704e2..8b8b96b81a8 100644
--- a/security/json_login_setup.rst
+++ b/security/json_login_setup.rst
@@ -102,7 +102,7 @@ The next step is to configure a route in your app matching this path:
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
@@ -111,7 +111,7 @@ The next step is to configure a route in your app matching this path:
// config/routes.php
use App\Controller\SecurityController;
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->add('login', '/login')
diff --git a/templates.rst b/templates.rst
index 7ab528b2ec7..aea86b8a091 100644
--- a/templates.rst
+++ b/templates.rst
@@ -230,7 +230,7 @@ Consider the following routing configuration:
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
add('blog_index', '/')
@@ -457,8 +457,8 @@ Rendering a Template Directly from a Route
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Although templates are usually rendered in controllers and services, you can
-render static pages that don't need any variables directly from the route
-definition. Use the special :class:`Symfony\\Bundle\\FrameworkBundle\\Controller\\TemplateController`
+render static pages from the route definition. Use the special
+:class:`Symfony\\Bundle\\FrameworkBundle\\Controller\\TemplateController`
provided by Symfony:
.. configuration-block::
@@ -468,22 +468,20 @@ provided by Symfony:
# config/routes.yaml
acme_privacy:
path: /privacy
- controller: Symfony\Bundle\FrameworkBundle\Controller\TemplateController
- defaults:
- # the path of the template to render
- template: 'static/privacy.html.twig'
+ # the path of the template to render
+ template: 'static/privacy.html.twig'
- # special options defined by Symfony to set the page cache
- maxAge: 86400
- sharedAge: 86400
+ # special options defined by Symfony to set the page cache
+ maxAge: 86400
+ sharedAge: 86400
- # whether or not caching should apply for client caches only
- private: true
+ # whether or not caching should apply for client caches only
+ private: true
- # optionally you can define some arguments passed to the template
- context:
- site_name: 'ACME'
- theme: 'dark'
+ # some variables passed to the template
+ context:
+ site_name: 'ACME'
+ theme: 'dark'
.. code-block:: xml
@@ -491,58 +489,56 @@ provided by Symfony:
+ xsi:schemaLocation="http://symfony.com/schema/routing
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
-
- static/privacy.html.twig
+ template="static/privacy.html.twig"
- 86400
- 86400
+ maxAge="86400"
+ sharedMaxAge="86400">
true
-
-
- ACME
- dark
-
-
+
+
+ ACME
+ dark
+
+
.. code-block:: php
// config/routes.php
- use Symfony\Bundle\FrameworkBundle\Controller\TemplateController;
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->add('acme_privacy', '/privacy')
- ->controller(TemplateController::class)
- ->defaults([
- // the path of the template to render
- 'template' => 'static/privacy.html.twig',
-
- // special options defined by Symfony to set the page cache
- 'maxAge' => 86400,
- 'sharedAge' => 86400,
-
- // whether or not caching should apply for client caches only
- 'private' => true,
-
- // optionally you can define some arguments passed to the template
- 'context' => [
- 'site_name' => 'ACME',
- 'theme' => 'dark',
- ]
+ // the path of the template to render and a context of variables passed to it
+ ->template('static/privacy.html.twig', [
+ 'site_name' => 'ACME',
+ 'theme' => 'dark',
])
+
+ // special options defined by Symfony to set the page cache
+ ->maxAge(86400)
+ ->sharedMaxAge(86400)
+
+ // whether or not caching should apply for client caches only
+ ->private()
;
};
+.. versionadded:: 5.1
+
+ This short syntax was introduced in Symfony 5.1. Before you had to
+ define the controller and specific route attributes using ``defaults``.
+
.. versionadded:: 5.1
The ``context`` option was introduced in Symfony 5.1.
diff --git a/translation/locale.rst b/translation/locale.rst
index 2dfd7c80b7c..b6bcfa26938 100644
--- a/translation/locale.rst
+++ b/translation/locale.rst
@@ -80,7 +80,7 @@ A better policy is to include the locale in the URL using the
+ https://symfony.com/schema/routing/framework-routing-1.0.xsd">
controller="App\Controller\ContactController::index">
@@ -92,7 +92,7 @@ A better policy is to include the locale in the URL using the
// config/routes.php
use App\Controller\ContactController;
- use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
+ use Symfony\Bundle\FrameworkBundle\Routing\Loader\Configurator\RoutingConfigurator;
return function (RoutingConfigurator $routes) {
$routes->add('contact', '/{_locale}/contact')