有時(shí)你會(huì)發(fā)現(xiàn)將你的路由的一部分變成全局可配置的是非常有用的。例如,如果你建立一個(gè)國際化的網(wǎng)站,你可能會(huì)開始在一個(gè)或兩個(gè)地方。你肯定會(huì)想你的路由添加一個(gè)要求來防止用戶匹配到其它地區(qū)而不是你支持的區(qū)域。
你可以要求你的 _locale 硬編碼在你所有的路徑中,但是一個(gè)更好的解決方案在你的路由配置中使用一個(gè)可配置的服務(wù)容器參數(shù):
YAML:
# app/config/routing.yml
contact:
path: /{_locale}/contact
defaults: { _controller: AppBundle:Main:contact }
requirements:
_locale: "%app.locales%"
XML:
<!-- 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="contact" path="/{_locale}/contact">
<default key="_controller">AppBundle:Main:contact</default>
<requirement key="_locale">%app.locales%</requirement>
</route>
</routes>
PHP:
// app/config/routing.php
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
$collection = new RouteCollection();
$collection->add('contact', new Route('/{_locale}/contact', array(
'_controller' => 'AppBundle:Main:contact',
), array(
'_locale' => '%app.locales%',
)));
return $collection;
你現(xiàn)在就可以在你的容器的某個(gè)地方控制和設(shè)置 app.locales 參數(shù)了:
YAML:
# app/config/config.yml
parameters:
app.locales: en|es
XML:
<!-- app/config/config.xml -->
<parameters>
<parameter key="app.locales">en|es</parameter>
</parameters>
PHP:
// app/config/config.php
$container->setParameter('app.locales', 'en|es');
你還可以使用一個(gè)參數(shù)來定義你的路由路徑(或者你的路徑的一部分):
YAML:
# app/config/routing.yml
some_route:
path: /%app.route_prefix%/contact
defaults: { _controller: AppBundle:Main:contact }
XML:
<!-- 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="some_route" path="/%app.route_prefix%/contact">
<default key="_controller">AppBundle:Main:contact</default>
</route>
</routes>
PHP:
// app/config/routing.php
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
$collection = new RouteCollection();
$collection->add('some_route', new Route('/%app.route_prefix%/contact', array(
'_controller' => 'AppBundle:Main:contact',
)));
return $collection;
就像在正常服務(wù)容器配置文件中那樣,如果在你的路徑中真的需要 % ,你可以通過雙打來避免百分比的意義,例如 /score-50%%,它會(huì)被重處理為 /score-50%。
然而,包括任何在 URL 的 % 字符會(huì)自動(dòng)生成的 URL 編碼,這個(gè)例子生成的 URL 會(huì)是 /score-50%25( %25 是編碼 % 字符的結(jié)果)。
關(guān)于在 Dependency Injection Class 下的參數(shù)處理請查看 Using Parameters within a Dependency Injection Class。