您的位置:首页 > 编程语言 > PHP开发

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

对于这种多域名的操作的话,大家是怎么处理的?

我这边现在是这样子的,建立了一个
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: