dcb9

第 152 位会员

会员
个人信息
  • 加入于 2015-09-07 10:43:20
  • 最后登录时间 3年前
个人成就
  • 发表文章次数 1
  • 发布回复次数 4
  • 个人主页浏览次数 18
Yii2 高级模板 多域名管理问题4年前

我这边现在是这样子的,建立了一个 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');
Yii2 小贴士集合4年前

@ruzuojun 求分析这两者的区别,和优劣。

Yii2 高级查询4年前
 public function active()
    {
     //   $this->andWhere(['status' => self::STATUS_ACTIVE]);
     //   return $this;
        可以直接写成 
        return $this->andWhere(['status' => self::STATUS_ACTIVE]);
    }

因为 andWhere 的返回值就是当前对象

Yii2 小贴士集合4年前

@ruzuojun #24楼 个人感觉应该用 $server_id = Yii::$app->getRequest()->get('server_id');