Symfony Routing Basics: Difference between revisions

From Littledamien Wiki
Jump to navigation Jump to search
No edit summary
Line 67: Line 67:


If a page value is not supplied in the URL, `$page` will have a default value of `1`.
If a page value is not supplied in the URL, `$page` will have a default value of `1`.
=== Restricting wildcard values ===
The `requirements` attribute of the `@Route` annotation enforces formatting of wildcard values with regular expressions.
<syntaxhighlight lang="php">
    /**
    * @Route("/blog/{page}", defaults={"page"=1}, requirements={"page"="\d+"})
    */
    public function showAction($page)
    {
        // ...
    }
</syntaxhighlight>
Now only integer values will match the route. A separate route could be created for string values.

Revision as of 21:22, 29 January 2015

Defining a route

Defining a route using annotations in a controller class:

// src/AppBundle/Controller/BlogController.php
namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

class BlogController extends Controller
{
    /**
     * @Route("/blog/{slug}")
     */
    public function showAction($slug)
    {
        // ...
    }
}

This basically creates a new page on the site.

Routes can alternatively be defined using Yaml, XML, or PHP, e.g.:

# app/config/config.yml
framework:
    # ...
    router: { resource: "%kernel.root_dir%/config/routing.yml" }

Wildcards in routes

Wildcards are defined with curly braces, e.g. {slug} below:

/**
     * @Route("/blog/{slug}")
     */
    public function showAction($slug)
    {
        // ...
    }

This route will match /blog/*. Any value placed after /blog/ will be passed to the method as the value of the $slug variable. E.g. a request for /blog/hello-world will cause value of $slug to be "hello-world".

Note that placeholders are required. In the example above, the URL /blog would require its own separate route.

Default wildcard values

In effect, the defaults attribute of @Route makes wildcard values optional in URLs:

/**
     * @Route("/blog/{page}", defaults={"page"=1})
     */
    public function showAction($page)
    {
        // ...
    }

If a page value is not supplied in the URL, $page will have a default value of 1.

Restricting wildcard values

The requirements attribute of the @Route annotation enforces formatting of wildcard values with regular expressions.

/**
     * @Route("/blog/{page}", defaults={"page"=1}, requirements={"page"="\d+"})
     */
    public function showAction($page)
    {
        // ...
    }

Now only integer values will match the route. A separate route could be created for string values.