Symfony2创建基于域名的路由相关示例
本文实例讲述了Symfony2创建基于域名的路由实现方法。分享给大家供大家参考,具体如下:
你可以匹配将要来到的请求以HTTP域名的方式
YAML方式
mobile_homepage:
path:/
host:m.example.com
defaults:{_controller:AcmeDemoBundle:Main:mobileHomepage}
homepage:
path:/
defaults:{_controller:AcmeDemoBundle:Main:homepage}
XML方式
<?xmlversion="1.0"encoding="UTF-8"?> <routesxmlns="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"> <routeid="mobile_homepage"path="/"host="m.example.com"> <defaultkey="_controller">AcmeDemoBundle:Main:mobileHomepage</default> </route> <routeid="homepage"path="/"> <defaultkey="_controller">AcmeDemoBundle:Main:homepage</default> </route> </routes>
PHP方式
useSymfony\Component\Routing\RouteCollection;
useSymfony\Component\Routing\Route;
$collection=newRouteCollection();
$collection->add('mobile_homepage',newRoute('/',array(
'_controller'=>'AcmeDemoBundle:Main:mobileHomepage',
),array(),array(),'m.example.com'));
$collection->add('homepage',newRoute('/',array(
'_controller'=>'AcmeDemoBundle:Main:homepage',
)));
return$collection;
两个路由匹配相同的路径 /,然而第一个将只有域名为m.example.com才匹配
使用占位符
这个域名选项使用占位符的路径匹配系统。这样就意味着你可以在你的域名中使用占位符匹配的域名。
YAML
projects_homepage:
path:/
host:"{project_name}.example.com"
defaults:{_controller:AcmeDemoBundle:Main:mobileHomepage}
homepage:
path:/
defaults:{_controller:AcmeDemoBundle:Main:homepage}
XML
<?xmlversion="1.0"encoding="UTF-8"?>
<routesxmlns="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">
<routeid="projects_homepage"path="/"host="{project_name}.example.com">
<defaultkey="_controller">AcmeDemoBundle:Main:mobileHomepage</default>
</route>
<routeid="homepage"path="/">
<defaultkey="_controller">AcmeDemoBundle:Main:homepage</default>
</route>
</routes>
PHP
useSymfony\Component\Routing\RouteCollection;
useSymfony\Component\Routing\Route;
$collection=newRouteCollection();
$collection->add('project_homepage',newRoute('/',array(
'_controller'=>'AcmeDemoBundle:Main:mobileHomepage',
),array(),array(),'{project_name}.example.com'));
$collection->add('homepage',newRoute('/',array(
'_controller'=>'AcmeDemoBundle:Main:homepage',
)));
return$collection;
你还可以为这些占位符设置条件和默认的选项。列如,如果你想匹配 m.example.com和mobile.example.com你可以按照如下方式
YAML
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
<?xmlversion="1.0"encoding="UTF-8"?>
<routesxmlns="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">
<routeid="mobile_homepage"path="/"host="{subdomain}.example.com">
<defaultkey="_controller">AcmeDemoBundle:Main:mobileHomepage</default>
<defaultkey="subdomain">m</default>
<requirementkey="subdomain">m|mobile</requirement>
</route>
<routeid="homepage"path="/">
<defaultkey="_controller">AcmeDemoBundle:Main:homepage</default>
</route>
</routes>
PHP
useSymfony\Component\Routing\RouteCollection;
useSymfony\Component\Routing\Route;
$collection=newRouteCollection();
$collection->add('mobile_homepage',newRoute('/',array(
'_controller'=>'AcmeDemoBundle:Main:mobileHomepage',
'subdomain'=>'m',
),array(
'subdomain'=>'m|mobile',
),array(),'{subdomain}.example.com'));
$collection->add('homepage',newRoute('/',array(
'_controller'=>'AcmeDemoBundle:Main:homepage',
)));
return$collection;
你还可以使用服务参数,如果你不想将域名写死写法如下
YAML
mobile_homepage:
path:/
host:"m.{domain}"
defaults:
_controller:AcmeDemoBundle:Main:mobileHomepage
domain:'%domain%'
requirements:
domain:'%domain%'
homepage:
path:/
defaults:{_controller:AcmeDemoBundle:Main:homepage}
XML
<?xmlversion="1.0"encoding="UTF-8"?>
<routesxmlns="http://symfony.com/schema/routing"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/routinghttp://symfony.com/schema/routing/routing-1.0.xsd">
<routeid="mobile_homepage"path="/"host="m.{domain}">
<defaultkey="_controller">AcmeDemoBundle:Main:mobileHomepage</default>
<defaultkey="domain">%domain%</default>
<requirementkey="domain">%domain%</requirement>
</route>
<routeid="homepage"path="/">
<defaultkey="_controller">AcmeDemoBundle:Main:homepage</default>
</route>
</routes>
PHP
useSymfony\Component\Routing\RouteCollection;
useSymfony\Component\Routing\Route;
$collection=newRouteCollection();
$collection->add('mobile_homepage',newRoute('/',array(
'_controller'=>'AcmeDemoBundle:Main:mobileHomepage',
'domain'=>'%domain%',
),array(
'domain'=>'%domain%',
),array(),'m.{domain}'));
$collection->add('homepage',newRoute('/',array(
'_controller'=>'AcmeDemoBundle:Main:homepage',
)));
return$collection;
提示
确保你总是包含了默认的选项domain占位符,否则你需要包含domain的值每当你使用该路由生成URL的时候。
使用包含进来的路由规则匹配
你可以设置域名选项通过导入路由配置文件,方式如下
YAML
acme_hello: resource:'@AcmeHelloBundle/Resources/config/routing.yml' host:"hello.example.com"
XML
<?xmlversion="1.0"encoding="UTF-8"?> <routesxmlns="http://symfony.com/schema/routing" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/routinghttp://symfony.com/schema/routing/routing-1.0.xsd"> <importresource="@AcmeHelloBundle/Resources/config/routing.xml"host="hello.example.com"/> </routes>
PHP
useSymfony\Component\Routing\RouteCollection;
$collection=newRouteCollection();
$collection->addCollection($loader->import("@AcmeHelloBundle/Resources/config/routing.php"),'',array(),array(),array(),'hello.example.com');
return$collection;
域名hello.example.com 将要被设置为加载进来的新路由配置文件中的每个路由
测试你的Controllers
你需要设置HTTP的域名头文件在你请求的对象中,如果你想正确的匹配到网址在你的测试函数中
$crawler=$client->request(
'GET',
'/homepage',
array(),
array(),
array('HTTP_HOST'=>'m.'.$client->getContainer()->getParameter('domain'))
);
更多关于Symfony2相关内容感兴趣的读者可查看本站专题:《Symfony框架入门教程》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《php优秀开发框架总结》、《ThinkPHP入门教程》、《ThinkPHP常用方法总结》、《ZendFrameWork框架入门教程》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家基于Symfony2框架的PHP程序设计有所帮助。