如何从路由向控制器传递额外的信息
在defaults
集合内部的参数,不一定非要匹配路由path
中的某个占位符。实际上,你可以使用defaults
数组去指定额外的参数,然后它们将能够作为控制器参数被访问到,同时还成为Request
对象的属性:
|
# 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方法的参数传入:
|
public function indexAction($page, $title)
{
// ...
} |
另外,这个title还可以通过Request
对象来访问:
|
use Symfony\Component\Httpfoundation\Request;
public function indexAction(Request $request, $page)
{
$title = $request->attributes->get('title');
// ...
} |
正如你看到的,$title
变量并没有在路由器的path里被定义,但是你还是可以在控制器中访问。通过action方法的参数,或者通过Request
对象的attributes
包(可以获取)。