竹林风 2019-12-06 11:17:30 5324次浏览 2条评论 2 0 0

做一个网站,后台在 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),写在其他方法也一样

代码

public static function Components($name, $appid = null)
{
    if ($appid == self::$app->id || $appid == null) {
        return self::$app->$name;
    }
    $componentsName = $appid . ucfirst($name);
    if (self::$app->has($componentsName)) {
        return self::$app->get($componentsName);
    } 
    $conf = include_once \Yii::getAlias("@{$appid}/config/main.php");
    if (isset($conf['components'][$name])) {
        self::$app->set($componentsName, $conf['components'][$name]);
        return self::$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();

其他组件用法类似

  • 评论于 2019-12-06 11:18 举报

    我觉得论坛需要换个富文本编辑器,这个编辑器真的好难用

    1 条回复
    评论于 2020-02-03 11:52 回复

    这个编辑器是我自己写的,还在完善中。

  • 评论于 2020-03-19 11:54 举报

    代码个别情况有问题修改一下
    `

    /**
     * 跨应用调用组件,调用的组件必须配置了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}组件");
        }
    }
    

    `

您需要登录后才可以评论。登录 | 立即注册