How to Pass Extra Information from a Route to a Controller

Parameters inside the defaults collection don’t necessarily have to match a placeholder in the route path. In fact, you can use the defaults array to specify extra parameters that will then be accessible as arguments to your controller:

  • YAML
    # app/config/routing.yml
    blog:
        path:      /blog/{page}
        defaults:
            _controller: AppBundle:Blog:index
            page:        1
            title:       "Hello world!"
    
  • XML
    <!-- 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
            http://symfony.com/schema/routing/routing-1.0.xsd">
    
        <route id="blog" path="/blog/{page}">
            <default key="_controller">AppBundle:Blog:index</default>
            <default key="page">1</default>
            <default key="title">Hello world!</default>
        </route>
    </routes>
    
  • PHP
    // app/config/routing.php
    use Symfony\Component\Routing\RouteCollection;
    use Symfony\Component\Routing\Route;
    
    $collection = new RouteCollection();
    $collection->add('blog', new Route('/blog/{page}', array(
        '_controller' => 'AppBundle:Blog:index',
        'page'        => 1,
        'title'       => 'Hello world!',
    )));
    
    return $collection;
    

Now, you can access this extra parameter in your controller:

public function indexAction($page, $title)
{
    // ...
}

As you can see, the $title variable was never defined inside the route path, but you can still access its value from inside your controller.