Yii2 高级模板 多域名管理问题
2016-02-04 16:43
597 查看
现在在网站中有这种情况,比如有一个 http://frontend.com/tv 需要根据判断用户的 User Agent ,如果用户是手机浏览器的话,则跳转到 http://mobile.com/tv。
frontend.com 所对应 frontend 应用
mobile.com 对应 mobile 应用
还有就是需要反过来的情况,比如用户在 PC 上访问 http://mobile.com/tv ,需要能自动跳到 http://frontend.com/tv
对于这种多域名的操作的话,大家是怎么处理的?
我这边现在是这样子的,建立了一个
这个组件配置方式如下:
组件源码:
现在如果要跳转的话是这样写的:
来源:http://www.getyii.com/topic/214
frontend.com 所对应 frontend 应用
mobile.com 对应 mobile 应用
还有就是需要反过来的情况,比如用户在 PC 上访问 http://mobile.com/tv ,需要能自动跳到 http://frontend.com/tv
对于这种多域名的操作的话,大家是怎么处理的?
我这边现在是这样子的,建立了一个
MultipleAppUrlManager的组件
这个组件配置方式如下:
return [ 'components' => [ 'urlManager' => [ 'class' => 'common\components\MultipleAppUrlManager', 'apps' => [ 'app-mobile' => [ 'hostInfo' => 'http://mobile.com', 'baseUrl' => '', 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ ], ], 'frontend' => [ 'hostInfo' => 'http://frontend.com', 'baseUrl' => '', 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ ], ], ], ], ], ];
组件源码:
<?php namespace common\components; use Yii; use yii\web\UrlManager; class MultipleAppUrlManager extends \yii\web\UrlManager { public $apps = []; public function init() { if (isset($this->apps[Yii::$app->id])) { $currentAppConfig = $this->apps[Yii::$app->id]; foreach ($currentAppConfig as $attribute => $value) { $this->$attribute = $value; } } parent::init(); } /** * @param array $params * @param null $appId * @return string * @throws \yii\base\InvalidConfigException */ public function createUrl($params = [], $appId = null) { if ($appId === null || $appId === Yii::$app->id) { return parent::createUrl($params); } else { if (!isset($this->apps[$appId])) { throw new \yii\base\InvalidConfigException('Please configure UrlManager of apps "' . $appId . '".'); } $appUrlManager = $this->_loadOtherAppInstance($appId); return $appUrlManager->createUrl($params); } } /** * @param array|string $params * @param null $scheme * @param null $appId * @return string * @throws \yii\base\InvalidConfigException */ public function createAbsoluteUrl($params, $scheme = null, $appId = null) { if ($appId === null || $appId === Yii::$app->id) { return parent::createAbsoluteUrl($params, $scheme); } else { if (!isset($this->apps[$appId])) { throw new \yii\base\InvalidConfigException('Please configure UrlManager of apps "' . $appId . '".'); } $appUrlManager = $this->_loadOtherAppInstance($appId); return $appUrlManager->createAbsoluteUrl($params); } } private $_appInstances = []; /** * @param string $appId * @return UrlManager * @throws \yii\base\InvalidConfigException */ private function _loadOtherAppInstance($appId) { if (!isset($this->_appInstances[$appId])) { $this->_appInstances[$appId] = Yii::createObject([ 'class' => '\yii\web\UrlManager', ] + $this->apps[$appId]); } return $this->_appInstances[$appId]; } public function getHostInfo($appId = null) { if ($appId === null || $appId === Yii::$app->id) { return parent::getHostInfo(); } else { $appUrlManager = $this->_loadOtherAppInstance($appId); return $appUrlManager->getHostInfo(); } } }
现在如果要跳转的话是这样写的:
# mobile tv absolute url return Yii::$app->getUrlManager()->createAbsoluteUrl('tv', null, 'app-mobile'); # frontend tv absolute url return Yii::$app->getUrlManager()->createAbsoluteUrl('tv', null, 'frontend');
来源:http://www.getyii.com/topic/214
相关文章推荐
- ThinkPHP - URL - 伪静态 - 路由 - 重写
- ThinkPHP - 配置项目结构
- 怎样配置PHP环境和安装Zendstdio编辑器
- PHP生成缩略图,控制图片质量,支持.png .jpg .gif
- PHP安全过滤函数
- yii2-lock-form 也许这就是你想要的,阻止表单多次提交
- PHP---正则表达式
- PHP日期与时间戳转换
- PHP/Yii2操作Cookie,常见问题以及注意事项
- yii2弹出层
- 教你如何写一个 Yii2 扩展
- Yii2之事件处理
- Yii Framework2.0开发教程(2)使用表单Form
- PHP 常用的header头部定义汇总
- php上传文件详解
- 扩展 Yii2 自带的日志组件
- 推荐20个最近很流行的优秀PHP框架
- 国外最流行的PHP MVC框架
- Yii2 如何实现表单事件之 Ajax 提交
- Yii2 如何更好的在页面注入CSS