如何从路由向控制器传递额外的信息

3.4 版本
维护中的版本

defaults集合内部的参数,不一定非要匹配路由path中的某个占位符。实际上,你可以使用defaults数组去指定额外的参数,然后它们将能够作为控制器参数被访问到,同时还成为Request对象的属性:

1
2
3
4
5
6
7
# app/config/routing.yml
blog:
    path:      /blog/{page}
    defaults:
        _controller: AppBundle:Blog:index
        page:        1
        title:       "Hello world!"
1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- 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>
1
2
3
4
5
6
7
8
9
10
11
12
// 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;

现在,在控制器里你可以访问到这个额外的参数,它作为一个控制器action方法的参数传入:

1
2
3
4
public function indexAction($page, $title)
{
    // ...
}

另外,这个title还可以通过Request对象来访问:

1
2
3
4
5
6
7
8
use Symfony\Component\HttpFoundation\Request;
 
public function indexAction(Request $request, $page)
{
    $title = $request->attributes->get('title');
 
    // ...
}

正如你看到的,$title变量并没有在路由器的path里被定义,但是你还是可以在控制器中访问。通过action方法的参数,或者通过Request对象的attributes包(可以获取)。

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)