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


Posted in PHP onNovember 14, 2016

本文实例讲述了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框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP为表单获取的URL 地址预设 http 字符串函数代码
May 26 PHP
PHP 强制下载文件代码
Oct 24 PHP
php pki加密技术(openssl)详解
Jul 01 PHP
PHP中is_file不能替代file_exists的理由
Mar 04 PHP
PHP fopen()和 file_get_contents()应用与差异介绍
Mar 19 PHP
php递归json类实例
Dec 02 PHP
php三元运算符知识汇总
Jul 02 PHP
深入讲解PHP Session及如何保持其不过期的方法
Aug 18 PHP
PHP实现的策略模式简单示例
Aug 25 PHP
PHP实现的简单sha1加密功能示例
Aug 27 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
Jan 16 PHP
Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()
Oct 23 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
Nov 14 #PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
Nov 14 #PHP
CodeIgniter开发实现支付宝接口调用的方法示例
Nov 14 #PHP
PHP实现无限分类的实现方法
Nov 14 #PHP
php mysql获取表字段名称和字段信息的三种方法
Nov 13 #PHP
PHP编写daemon process 实例详解
Nov 13 #PHP
php版微信小店API二次开发及使用示例
Nov 12 #PHP
You might like
在PHP中养成7个面向对象的好习惯
2010/07/17 PHP
PHP的substr_replace将指定两位置之间的字符替换为*号
2011/05/04 PHP
解析phpstorm + xdebug 远程断点调试
2013/06/20 PHP
php实现的常见排序算法汇总
2014/09/08 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
2018/09/04 PHP
PHP时间函数使用详解
2019/03/21 PHP
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
2011/02/23 Javascript
jQuery EasyUI API 中文文档 - ProgressBar 进度条
2011/09/29 Javascript
基于jquery实现拆分姓名的方法(纯JS版)
2013/05/08 Javascript
Javascript中string转date示例代码
2013/11/01 Javascript
JQuery中extend的用法实例分析
2015/02/08 Javascript
举例讲解Node.js中的Writable对象
2015/07/29 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
微信小程序图片自适应支持多图实例详解
2017/06/21 Javascript
解决vue 更改计算属性后select选中值不更改的问题
2018/03/02 Javascript
vue-cli项目优化方法- 缩短首屏加载时间
2018/04/01 Javascript
详解react-redux插件入门
2018/04/19 Javascript
angularjs实现的购物金额计算工具示例
2018/05/08 Javascript
详解webpack 最简打包结果分析
2019/02/20 Javascript
javascript网页随机点名实现过程解析
2019/10/15 Javascript
解决vue项目中出现Invalid Host header的问题
2020/11/17 Javascript
python简单实现基数排序算法
2015/05/16 Python
Python3实现简单可学习的手写体识别(实例讲解)
2017/10/21 Python
详解Python图像处理库Pillow常用使用方法
2019/09/02 Python
Manjaro、pip、conda更换国内源的方法
2020/11/17 Python
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
iframe在移动端的缩放的示例代码
2018/10/12 HTML / CSS
如何找出EMP表里面SALARY第N高的employee
2013/12/05 面试题
大学社团活动总结
2014/04/26 职场文书
公司离职证明范本(汇总)
2014/09/10 职场文书
新店开张宣传语
2015/07/13 职场文书
英语教学课后反思
2016/02/15 职场文书
如何拟写通知正文?
2019/04/02 职场文书
JS数组去重详情
2021/11/07 Javascript
JAVA SpringMVC实现自定义拦截器
2022/03/16 Python
vue ref如何获取子组件属性值
2022/03/31 Vue.js