Symfony Routing Basics

From Littledamien Wiki
Revision as of 21:29, 29 January 2015 by Video8 (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Defining a route[edit]

Defining a route using annotations in a controller class:[1]

// 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[edit]

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

/**
     * @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[edit]

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

/**
     * @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[edit]

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

/**
     * @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.

HTTP method requirements[edit]

Method requirements are set with the @Method annotation: @Method("GET"), @Method("POST"), etc.[5]

Notes[edit]

  1. Basic Route Configuration, Symfony routing documentation
  2. Routing with Placeholders, Symfony routing documentation
  3. Required and Optional Placeholders, Symfony routing documenation
  4. Adding Requirements, Symfony routing documentation]
  5. Adding HTTP Method Requirements, Symfony routing documentation