Yii2 高级模板 多域名管理问题

现在在网站中有这种情况,比如有一个 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

时间: 2024-08-03 03:47:47

Yii2 高级模板 多域名管理问题的相关文章

Yii2 高级模板不使用Apache配置目录,将前后台入口移到根目录

刚刚入手Yii2高级模板不久,部署项目时,得部署2个应用,个人感觉很繁琐,就将前后台入口文件全部拿到项目根目录.但是一看,完了,出错了!找教程找不到,还是自己解决吧 为了以后好升级,不改变Yii2核心文件,只需改2个文件就可以 将Vendor/yiisoft/yii2/web/AssetManger.php文件的69行 public $basePath = '@webroot/assets'; 改为 public $basePath = '@webroot/frontend/web/assets

yii2高级模板安装

通过 Composer 安装 如果还没有安装 Composer,在 Linux 和 Mac OS X 中可以运行如下命令: curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer 安装完Composer,运行下面的命令来安装Composer Asset插件: php composer.phar global require "fxp/composer-asset-plugi

yii2.0高级模板归档文件windows7下安装

本地php环境用的是phpstudy搭建的 安装yii分为2步,1设置php环境变量.2安装yii 1设置php环境变量 php.ini中找到(去掉以下;) ;extension=php_gd2.dll;extension=php_mysql.dll;extension=php_sockets.dll ;On windows:;extension_dir = "ext" //你存放php的目录,此处整个安装完成后要改回来,不然phpadmin,登陆后打不开,原因未知? 右击[计算机]-

深入浅出Zabbix 3.0 -- 第七章 模板配置与管理

第七章  模板配置与管理 我们在主机中不仅可以添加很多需要监控的指标(即监控项),还可以添加图形.触发器.监控项组.展示屏.Web scenarios和low-level Discovery,如果在每个主机中添加这些对象,尤其是在一个大型环境中,其工作量是不可想象的,何况需要监控的主机有很多具有相同的监控属性,需要重复相同的配置工作,如果手工完成这些配置任务几乎是不可能的.好在Zabbix为我们提供了模板,通过在不同的模板中添加监控项.触发器.图形等配置并应用到任意数量的主机上.当然对于特殊的监

Yii2高级版本复制新项目出现问题解决(转)

引用于 http://www.linuxidc.com/Linux/2015-02/114116.htm Yii2高级版本复制新项目会遇到下面的报错信息: exception 'yii\base\InvalidRouteException' with message 'Unable to resolve the request "site/error".' in /Users/yuzhiyuan/Documents/htdocs/yii-application/vendor/yiiso

安装yii2高级应用模板

composer global require "fxp/composer-asset-plugin:1.0.0" composer create-project --prefer-dist yiisoft/yii2-app-advanced project-name 下载完后运行yii.bat和init.bat文件

yii2如何环境部署?yii2高级模版安装教程

使用 Composer安装: 1.设置php环境变量: 在环境变量中classpash或者用户变量中path 后面追加添加php.exe目录地址: 这样cmd中执行php即可找到php.exe 2.安装Composer : 使用安装程序 这是将 Composer 安装在你机器上的最简单的方法. 下载并且运行 Composer-Setup.exe( https://getcomposer.org/Composer-Setup.exe),它将安装最新版本的 Composer ,并设置好系统的环境变量

基于H.ui.Admin UI模板的网站管理后台

最近接手一个跨境电商平台开发,客户侧重电商网站UI设计,对管理后台要求不高,由我们决定选哪一款后台模板.找来找去,感觉还是H.ui靠谱一些,主要是这个模板清爽,不需要过多选择.其他的流行后台模板也看了,但功能繁杂,选择起来很费劲,要花很多时间拆解. 所以,考虑到是外包项目,速度和效率第一,越快上手越好. 现在把几个效果图贴出来,与大家分享,欢迎指正:

SSH(六)hibernate持久层模板于事务管理

持久层只要完成数据对数据库增删改查的操作,我们常说的hibernate区别于mybatis是在于他的全自动,而hibernate的全自动则主要体现于 他的模板,一些简单的数据操作我们就不用再去手写sql了,可以通过对hibernate模板的配置去完成. 一.在dao中注入hibernate模板 1.1在dao层继承spring提供的hibernate模板 修改实体product类,让他继承HibernateDaoSupport如图: 1.2在applicationcontext.xml中配置da