做一个网站,后台在 backend 模块,前台在 frontend,
就有如下问题

  1. 后台发布新闻,需要跳转前台查看信息,假设网站新闻页面的地址美化后是 /news/100.html,后台无法直接生成前台的美化 URL
  2. 后台和前台缓存位置不一样,后台默认为 backend/runtime/cache,前台默认为frontend/runtime/cache,假如后台改了配置更新缓存,那么 \Yii::$app->cache->flush()无法对 frontend 生效
    ......

所以有需要跨分组调用组件的需要,比如backend调用frontend的缓存组件更新缓存等

实现

我是把方法写在Yii.php(重构继承\yii\BaseYii),写在其他方法也一样

代码

/**
 * 跨应用调用组件,调用的组件必须配置了Class
 * @param $name //组件名称
 * @param null $appid //组件ID,
 * @return mixed|object|null
 * @throws \yii\base\InvalidConfigException,和项目目录保持一致
 */
public static function component($name, $appid = null)
{
    if ($appid == \Yii::$app->id || $appid == null) {//判断是否调用当前项目的组件
        if (Yii::$app->has($name)) {//判断当前项目是否配置了组件,有的话直接获取
            return \Yii::$app->get($name);
        } else {//没有配置组件,抛出异常
            throw new \Exception("{$appid}模块未配置{$name}组件");
        }
    }
    $componentsName = $appid . ucfirst($name);//设置一个组件ID,避免和全局组件重复
    if (\Yii::$app->has($componentsName)) {//检查是否设置过
        return \Yii::$app->get($componentsName);
    }
    //获取需要的跨组的项目配置,appid和子项目保持一致
    $conf = include_once \Yii::getAlias("@{$appid}/config/main.php");
    if (isset($conf['components'][$name])) {//查看所要子项目是否配置了组件
        \Yii::$app->set($componentsName, $conf['components'][$name]);//设置一个组件
        return \Yii::$app->get($componentsName);//返回组件
    } else {//未配置,抛出异常
        throw new \Exception("{$appid}模块未配置{$name}组件");
    }
}

参数 $name,组件名称,必选
$appid 应用名称,bootstrap.php 中配置的应用目录,最好应用ID和应用目录保持一致

用法

在后台创建前台URL

$frontendAuthManager=Yii::Components('authManager','frontend');
$frontendAuthManager->createUrl(['/news/info','id'=>'100']);//news/100.html

在后台更新前台缓存

$frontendCache=Yii::Components('cache','frontend');
$frontendCache->flush();

其他组件用法类似

所有评论
加载评论 ...
发表评论