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程序设计有所帮助。