模块概述
目录结构:
我们创建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
如上图,点击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”。
- @yii: BashYii.php 文件所在的目录(也被成为框架安装目录)\vendor\yiisoft\yii2
- @app:当前运行的应用所在目录。
- runtime:指定运行的应用的yii\base\Application:runtimePath。默认@app/runtime。
- webroot:指向包含入口文件的目录/web。
- 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”下的资源文件。
Comment here is closed