本文實例講述了Symfony2創(chuàng)建基于域名的路由實現(xiàn)方法。分享給大家供大家參考,具體如下:
你可以匹配將要來到的請求以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才匹配
使用占位符
這個域名選項使用占位符的路徑匹配系統(tǒng)。這樣就意味著你可以在你的域名中使用占位符匹配的域名。
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 ; |
你還可以為這些占位符設(shè)置條件和默認(rèn)的選項。列如,如果你想匹配 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 ; |
你還可以使用服務(wù)參數(shù),如果你不想將域名寫死寫法如下
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 ; |
提示
確保你總是包含了默認(rèn)的選項 domain占位符,否則你需要包含 domain的值每當(dāng)你使用該路由生成URL的時候。
使用包含進(jìn)來的路由規(guī)則匹配
你可以設(shè)置域名選項通過導(dǎo)入路由配置文件,方式如下
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 將要被設(shè)置為加載進(jìn)來的新路由配置文件中的每個路由
測試你的Controllers
你需要設(shè)置HTTP的域名頭文件在你請求的對象中,如果你想正確的匹配到網(wǎng)址在你的測試函數(shù)中
1
2
3
4
5
6
7
|
$crawler = $client ->request( 'GET' , '/homepage' , array (), array (), array ( 'HTTP_HOST' => 'm.' . $client ->getContainer()->getParameter( 'domain' )) ); |
希望本文所述對大家基于Symfony2框架的PHP程序設(shè)計有所幫助。