高级模板跨应用调用组件 [ 2.0 版本 ]
做一个网站,后台在 backend 模块,前台在 frontend,
就有如下问题
- 后台发布新闻,需要跳转前台查看信息,假设网站新闻页面的地址美化后是
/news/100.html
,后台无法直接生成前台的美化 URL - 后台和前台缓存位置不一样,后台默认为
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();
其他组件用法类似
竹林风
注册时间:2017-04-06
最后登录:2022-02-15
在线时长:53小时3分
最后登录:2022-02-15
在线时长:53小时3分
- 粉丝4
- 金钱135
- 威望40
- 积分1065
共 2 条评论
我觉得论坛需要换个富文本编辑器,这个编辑器真的好难用
这个编辑器是我自己写的,还在完善中。
代码个别情况有问题修改一下
`
/** * 跨应用调用组件,调用的组件必须配置了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}组件"); } }
`