You are browsing the documentation for Symfony 3.4 which is not maintained anymore.
Consider upgrading your projects to Symfony 5.2.
How to Include External Routing Resources
How to Include External Routing Resources¶
Simple applications can define all their routes in a single configuration file -
usually app/config/routing.yml
(see Loading Routes).
However, in most applications it’s common to import routes definitions from
different resources: PHP annotations in controller files, YAML, XML or PHP
files stored in some directory, etc.
This can be done by importing routing resources from the main routing file:
- YAML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
# app/config/routing.yml app_file: # loads routes from the given routing file stored in some bundle resource: '@AcmeBundle/Resources/config/routing.yml' app_annotations: # loads routes from the PHP annotations of the controllers found in that directory resource: '@AppBundle/Controller/' type: annotation app_directory: # loads routes from the YAML, XML or PHP files found in that directory resource: '../legacy/routing/' type: directory app_bundle: # loads routes from the YAML, XML or PHP files found in some bundle directory resource: '@AcmeOtherBundle/Resources/config/routing/' type: directory
- XML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
<!-- app/config/routing.xml --> <?xml version="1.0" encoding="UTF-8" ?> <routes xmlns="http://symfony.com/schema/routing" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/routing https://symfony.com/schema/routing/routing-1.0.xsd"> <!-- loads routes from the given routing file stored in some bundle --> <import resource="@AcmeBundle/Resources/config/routing.yml"/> <!-- loads routes from the PHP annotations of the controllers found in that directory --> <import resource="@AppBundle/Controller/" type="annotation"/> <!-- loads routes from the YAML or XML files found in that directory --> <import resource="../legacy/routing/" type="directory"/> <!-- loads routes from the YAML or XML files found in some bundle directory --> <import resource="@AcmeOtherBundle/Resources/config/routing/" type="directory"/> </routes>
- PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
// app/config/routing.php use Symfony\Component\Routing\RouteCollection; $routes = new RouteCollection(); $routes->addCollection( // loads routes from the given routing file stored in some bundle $loader->import("@AcmeBundle/Resources/config/routing.yml") // loads routes from the PHP annotations of the controllers found in that directory $loader->import("@AppBundle/Controller/", "annotation") // loads routes from the YAML or XML files found in that directory $loader->import("../legacy/routing/", "directory") // loads routes from the YAML or XML files found in some bundle directory $routes->import('@AcmeOtherBundle/Resources/config/routing/public/', 'directory'); }; return $routes;
Note
When importing resources, the key (e.g. app_file
) is the name of collection.
Just be sure that it’s unique per file so no other lines override it.
Prefixing the URLs of Imported Routes¶
You can also choose to provide a “prefix” for the imported routes. For example,
to prefix all application routes with /site
(e.g.``/site/blog/{slug}``
instead of /blog/{slug}
):
- Annotations
1 2 3 4 5 6 7 8 9
use Symfony\Component\Routing\Annotation\Route; /** * @Route("/site") */ class DefaultController { // ... }
- YAML
1 2 3 4 5
# app/config/routing.yml app: resource: '@AppBundle/Controller/' type: annotation prefix: /site
- XML
1 2 3 4 5 6 7 8 9 10 11 12
<!-- app/config/routing.xml --> <?xml version="1.0" encoding="UTF-8" ?> <routes xmlns="http://symfony.com/schema/routing" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/routing https://symfony.com/schema/routing/routing-1.0.xsd"> <import resource="@AppBundle/Controller/" type="annotation" prefix="/site"/> </routes>
- PHP
1 2 3 4 5 6 7 8 9 10
// app/config/routing.php use Symfony\Component\Routing\RouteCollection; $app = $loader->import('@AppBundle/Controller/', 'annotation'); $app->addPrefix('/site'); $routes = new RouteCollection(); $routes->addCollection($app); return $routes;
The path of each route being loaded from the new routing resource will now
be prefixed with the string /site
.
Prefixing the Names of Imported Routes¶
New in version 3.4: The feature to prefix route names was introduced in Symfony 3.4.
You also have the possibility to prefix all route names defined in a controller
class with the name
attribute of the @Route
annotation:
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route(name="blog_")
*/
class BlogController extends Controller
{
/**
* @Route("/blog", name="index")
*/
public function indexAction()
{
// ...
}
/**
* @Route("/blog/posts/{slug}", name="post")
*/
public function showAction(Post $post)
{
// ...
}
}
In this example, the names of the routes will be blog_index
and blog_post
.
Adding a Host Requirement to Imported Routes¶
You can set the host regex on imported routes. For more information, see Using Host Matching of Imported Routes.
This work, including the code samples, is licensed under a Creative Commons BY-SA 3.0 license.