Symfony Routing Basics: Difference between revisions

From Littledamien Wiki
Jump to navigation Jump to search
No edit summary
 
(3 intermediate revisions by the same user not shown)
Line 2: Line 2:
== Defining a route ==
== Defining a route ==


Defining a route using annotations in a controller class:
Defining a route using annotations in a controller class:<ref>[http://symfony.com/doc/current/book/routing.html#basic-route-configuration Basic Route Configuration], Symfony routing documentation</ref>


<syntaxhighlight lang="php" highlight="5,10">
<syntaxhighlight lang="php" highlight="5,10">
Line 36: Line 36:
=== Wildcards in routes ===
=== Wildcards in routes ===


Wildcards are defined with curly braces, e.g. `{slug}` below:
Wildcards are defined with curly braces, e.g. `{slug}` below:<ref>[http://symfony.com/doc/current/book/routing.html#routing-with-placeholders Routing with Placeholders], Symfony routing documentation</ref>


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
Line 51: Line 51:


Note that placeholders are required. In the example above, the URL `/blog` would require its own separate route.
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:<ref>[http://symfony.com/doc/current/book/routing.html#required-and-optional-placeholders Required and Optional Placeholders], Symfony routing documenation</ref>
<syntaxhighlight lang="php">
    /**
    * @Route("/blog/{page}", defaults={"page"=1})
    */
    public function showAction($page)
    {
        // ...
    }
</syntaxhighlight>
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.<ref>[http://symfony.com/doc/current/book/routing.html#adding-requirements Adding Requirements], Symfony routing documentation]</ref>
<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.
=== HTTP method requirements ===
Method requirements are set with the `@Method` annotation: `@Method("GET")`, `@Method("POST")`, etc.<ref>[http://symfony.com/doc/current/book/routing.html#adding-http-method-requirements Adding HTTP Method Requirements], Symfony routing documentation</ref>
== Notes ==
<references />

Latest revision as of 21:29, 29 January 2015

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