Symfony2创建基于域名的路由相关示例

5年以前  |  阅读数:512 次  |  编程语言:PHP 

本文实例讲述了Symfony2创建基于域名的路由实现方法。分享给大家供大家参考,具体如下:

你可以匹配将要来到的请求以HTTP域名的方式

YAML方式


    mobile_homepage:
     path:  /
     host:  m.example.com
     defaults: { _controller: AcmeDemoBundle:Main:mobileHomepage }
    homepage:
     path:  /
     defaults: { _controller: AcmeDemoBundle:Main:homepage }

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="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方式


    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


    projects_homepage:
     path:  /
     host:  "{project_name}.example.com"
     defaults: { _controller: AcmeDemoBundle:Main:mobileHomepage }
    homepage:
     path:  /
     defaults: { _controller: AcmeDemoBundle:Main:homepage }

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="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


    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


    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


    <?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


    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


    mobile_homepage:
     path:  /
     host:  "m.{domain}"
     defaults:
      _controller: AcmeDemoBundle:Main:mobileHomepage
      domain: '%domain%'
     requirements:
      domain: '%domain%'
    homepage:
     path: /
     defaults: { _controller: AcmeDemoBundle:Main:homepage }

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="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


    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


    acme_hello:
     resource: '@AcmeHelloBundle/Resources/config/routing.yml'
     host:  "hello.example.com"

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">
     <import resource="@AcmeHelloBundle/Resources/config/routing.xml" host="hello.example.com" />
    </routes>

PHP


    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的域名头文件在你请求的对象中,如果你想正确的匹配到网址在你的测试函数中


    $crawler = $client->request(
     'GET',
     '/homepage',
     array(),
     array(),
     array('HTTP_HOST' => 'm.' . $client->getContainer()->getParameter('domain'))
    );

更多关于Symfony2相关内容感兴趣的读者可查看本站专题:《Symfony框架入门教程》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《php优秀开发框架总结》、《ThinkPHP入门教程》、《ThinkPHP常用方法总结》、《Zend FrameWork框架入门教程》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

希望本文所述对大家基于Symfony2框架的PHP程序设计有所帮助。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例