本文实例讲述了Symfony2创建基于域名的路由实现方法。分享给大家供大家参考,具体如下:
你可以匹配将要来到的请求以HTTP域名的方式
YAML方式
1
2
3
4
5
6
7
|
mobile_homepage: path: / host: m.example.com defaults: { _controller: AcmeDemoBundle:Main:mobileHomepage } homepage: path: / defaults: { _controller: AcmeDemoBundle:Main:homepage } |
XML方式
1
2
3
4
5
6
7
8
9
10
11
12
|
<? 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 = "mobile_homepage" path = "/" host = "m.example.com" > < default key = "_controller" >AcmeDemoBundle:Main:mobileHomepage</ default > </ route > < route id = "homepage" path = "/" > < default key = "_controller" >AcmeDemoBundle:Main:homepage</ default > </ route > </ routes > |
PHP方式
1
2
3
4
5
6
7
8
9
10
|
use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\Route; $collection = new RouteCollection(); $collection ->add( 'mobile_homepage' , new Route( '/' , array ( '_controller' => 'AcmeDemoBundle:Main:mobileHomepage' , ), array (), array (), 'm.example.com' )); $collection ->add( 'homepage' , new Route( '/' , array ( '_controller' => 'AcmeDemoBundle:Main:homepage' , ))); return $collection ; |
两个路由匹配相同的路径 / ,然而第一个将只有域名为m.example.com才匹配
使用占位符
这个域名选项使用占位符的路径匹配系统。这样就意味着你可以在你的域名中使用占位符匹配的域名。
YAML
1
2
3
4
5
6
7
|
projects_homepage: path: / host: "{project_name}.example.com" defaults: { _controller: AcmeDemoBundle:Main:mobileHomepage } homepage: path: / defaults: { _controller: AcmeDemoBundle:Main:homepage } |
XML
1
2
3
4
5
6
7
8
9
10
11
12
|
<? 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 = "projects_homepage" path = "/" host = "{project_name}.example.com" > < default key = "_controller" >AcmeDemoBundle:Main:mobileHomepage</ default > </ route > < route id = "homepage" path = "/" > < default key = "_controller" >AcmeDemoBundle:Main:homepage</ default > </ route > </ routes > |
PHP
1
2
3
4
5
6
7
8
9
10
|
use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\Route; $collection = new RouteCollection(); $collection ->add( 'project_homepage' , new Route( '/' , array ( '_controller' => 'AcmeDemoBundle:Main:mobileHomepage' , ), array (), array (), '{project_name}.example.com' )); $collection ->add( 'homepage' , new Route( '/' , array ( '_controller' => 'AcmeDemoBundle:Main:homepage' , ))); return $collection ; |
你还可以为这些占位符设置条件和默认的选项。列如,如果你想匹配 m.example.com 和mobile.example.com你可以按照如下方式
YAML
1
2
3
4
5
6
7
8
9
10
11
|
mobile_homepage: path: / host: "{subdomain}.example.com" defaults: _controller: AcmeDemoBundle:Main:mobileHomepage subdomain: m requirements: subdomain: m|mobile homepage: path: / defaults: { _controller: AcmeDemoBundle:Main:homepage } |
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<? 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 = "mobile_homepage" path = "/" host = "{subdomain}.example.com" > < default key = "_controller" >AcmeDemoBundle:Main:mobileHomepage</ default > < default key = "subdomain" >m</ default > < requirement key = "subdomain" >m|mobile</ requirement > </ route > < route id = "homepage" path = "/" > < default key = "_controller" >AcmeDemoBundle:Main:homepage</ default > </ route > </ routes > |
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
|
use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\Route; $collection = new RouteCollection(); $collection ->add( 'mobile_homepage' , new Route( '/' , array ( '_controller' => 'AcmeDemoBundle:Main:mobileHomepage' , 'subdomain' => 'm' , ), array ( 'subdomain' => 'm|mobile' , ), array (), '{subdomain}.example.com' )); $collection ->add( 'homepage' , new Route( '/' , array ( '_controller' => 'AcmeDemoBundle:Main:homepage' , ))); return $collection ; |
你还可以使用服务参数,如果你不想将域名写死写法如下
YAML
1
2
3
4
5
6
7
8
9
10
11
|
mobile_homepage: path: / host: "m.{domain}" defaults: _controller: AcmeDemoBundle:Main:mobileHomepage domain: '%domain%' requirements: domain: '%domain%' homepage: path: / defaults: { _controller: AcmeDemoBundle:Main:homepage } |
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<? 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 = "mobile_homepage" path = "/" host = "m.{domain}" > < default key = "_controller" >AcmeDemoBundle:Main:mobileHomepage</ default > < default key = "domain" >%domain%</ default > < requirement key = "domain" >%domain%</ requirement > </ route > < route id = "homepage" path = "/" > < default key = "_controller" >AcmeDemoBundle:Main:homepage</ default > </ route > </ routes > |
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
|
use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\Route; $collection = new RouteCollection(); $collection ->add( 'mobile_homepage' , new Route( '/' , array ( '_controller' => 'AcmeDemoBundle:Main:mobileHomepage' , 'domain' => '%domain%' , ), array ( 'domain' => '%domain%' , ), array (), 'm.{domain}' )); $collection ->add( 'homepage' , new Route( '/' , array ( '_controller' => 'AcmeDemoBundle:Main:homepage' , ))); return $collection ; |
提示
确保你总是包含了默认的选项 domain占位符,否则你需要包含 domain的值每当你使用该路由生成URL的时候。
使用包含进来的路由规则匹配
你可以设置域名选项通过导入路由配置文件,方式如下
YAML
1
2
3
|
acme_hello: resource: '@AcmeHelloBundle/Resources/config/routing.yml' host: "hello.example.com" |
XML
1
2
3
4
5
6
|
<? 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" > < import resource = "@AcmeHelloBundle/Resources/config/routing.xml" host = "hello.example.com" /> </ routes > |
PHP
1
2
3
4
|
use Symfony\Component\Routing\RouteCollection; $collection = new RouteCollection(); $collection ->addCollection( $loader ->import( "@AcmeHelloBundle/Resources/config/routing.php" ), '' , array (), array (), array (), 'hello.example.com' ); return $collection ; |
域名 hello.example.com 将要被设置为加载进来的新路由配置文件中的每个路由
测试你的Controllers
你需要设置HTTP的域名头文件在你请求的对象中,如果你想正确的匹配到网址在你的测试函数中
1
2
3
4
5
6
7
|
$crawler = $client ->request( 'GET' , '/homepage' , array (), array (), array ( 'HTTP_HOST' => 'm.' . $client ->getContainer()->getParameter( 'domain' )) ); |
希望本文所述对大家基于Symfony2框架的PHP程序设计有所帮助。