模块概述

目录结构:
1.png
我们创建modules模块代码如下:

<?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‘,代码如下

'modules'=>[
        'admin' => [
            'class' => 'app\modules\admin\Module',
        ],
    ],

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

使用Gii创建模块

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

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访问:

http://hostname/index.php?r=gii

2.png

3.png

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

模块中资源文件

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

http://loaclhost/modules/admin/images/1.jpg

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

<?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 获取图片路径。

<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()”方法。以上代码在浏览器中显示的内容如下:

<div>modules-admin-views-index</div>
<img src="/assets/4ebd21cf/images/1.jpg" style="width: 50%;height: 50%">

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

Last modification:October 17, 2019
如果觉得我的文章对你有用,请随意赞赏