前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Yii2 中的模块modules

Yii2 中的模块modules

作者头像
友儿
发布2022-09-11 12:13:00
1.1K0
发布2022-09-11 12:13:00
举报
文章被收录于专栏:友儿友儿
模块概述 我们创建modules模块代码如下:
代码语言:javascript
复制
<?php

namespace app\modules\admin;
use yii\web\AssetManager;

/**
 * admin module definition class
 */
class Module extends \yii\base\Module
{
    /**
     * {@inheritdoc}
     */
    public $controllerNamespace = 'app\modules\admin\controllers';

    /**
     * {@inheritdoc}
     */
    public function init()
    {
        parent::init();

        // custom initialization code goes here
    } 
}

然后需要把模块ID添加到所属应用中,打开配置文件config/web.php,在modules对应的数组中添加元素’admin‘,代码如下

代码语言:javascript
复制
'modules'=>[
        'admin' => [
            'class' => 'app\modules\admin\Module',
        ],
    ],

访问:index.php?r=admin/default/index即可。

使用Gii创建模块

通过配置应用的yii\base\Application::modules属性开启它。通常来讲在config/wep.php文件中配置代码如下

代码语言:javascript
复制
if (YII_ENV_DEV) {
    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',
        // uncomment the following to add your IP if you are not connecting from localhost.
        //'allowedIPs' => ['127.0.0.1', '::1'],
    ];
}

这段配置表明,如果当前是开发环境,应用会包含gii模块,模块类是yii\gii\Module。通过URL访问:

代码语言:javascript
复制
http://hostname/index.php?r=gii

点击Preview预览,最后点击Generate生成所有文件,请确保modules文件夹有可写的权限。

模块中资源文件

在admin目录创建images文件夹保存图片如下通过URL访问1.jpg,

代码语言:javascript
复制
http://loaclhost/modules/admin/images/1.jpg

显然modules目录下的文件是不允许通过URL访问的。 在modules/admin下创建assets文件夹来包含资源文件 在调用AssetManager类的publish()方法,这个方法首先会在应用的asset文件夹下创建一个随机不冲突的文件夹如4ebd21cf,然后将模块的assets目录复制到4ebd21cf文件夹下让视图调用。 下面我们看一下代码实现: 我们在Module类中增加getAssetsUrl方法

代码语言:javascript
复制
<?php

namespace app\modules\admin;
use yii\web\AssetManager;

/**
 * admin module definition class
 */
class Module extends \yii\base\Module
{
    /**
     * {@inheritdoc}
     */
    public $controllerNamespace = 'app\modules\admin\controllers';

    /**
     * {@inheritdoc}
     */
    public function init()
    {
        parent::init();

        // custom initialization code goes here
    }
    public function getAssetsUrl()
    {
        $assetManager = new AssetManager();
        return $assetManager->publish("@app/modules/admin/assets")[1];
    }
}

Publish()方法第一个参数$path是要发布的asssets目录保存的路径,这里使用别名“@app/modules/admin/assets”,指定保存assets目录为“/modules/admin/assets”。

提示

  1. @yii: BashYii.php 文件所在的目录(也被成为框架安装目录)\vendor\yiisoft\yii2
  2. @app:当前运行的应用所在目录。
  3. runtime:指定运行的应用的yii\base\Application:runtimePath。默认@app/runtime。
  4. webroot:指向包含入口文件的目录/web。
  5. vendor: 指定包含yii\base\Application:vendorPath。默认@app/vendor。

言归正传: 在视图文件中modules/admin/views/default/index.php 获取图片路径。

代码语言:javascript
复制
<div>modules-admin-views-index</div>
<img src="<?=$this->context->module->assetsUrl;?>/images/1.jpg" style="width: 50%;height: 50%">

说明:“this”表示View实例对象,在视图中的“this->context”表示所在控制器实例对象,“modules”表示该控制器所属的模块,这里表示modules/admin目录下的模块类Module的实例对象,该对象调用不存在的属性“assetUrl”的时候,就会通过魔术方法_get(),调用moduels/admin/Module类的“getAssetsUrl()”方法。以上代码在浏览器中显示的内容如下:

代码语言:javascript
复制
<div>modules-admin-views-index</div>
<img src="/assets/4ebd21cf/images/1.jpg" style="width: 50%;height: 50%">

在调用publish()方法的过程中,在应用目录下随机创建了“4ebd21cf”文件夹,并把/modules/admin/assets目录下的文件复制过去,这样在视图中实际访问的就是应用目录“4ebd21cf”下的资源文件。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 模块概述 我们创建modules模块代码如下:
  • 使用Gii创建模块
  • 模块中资源文件
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档