模块是独立的软件单元,由模型,视图, 控制器和其他支持组件组成,
终端用户可以访问在应用主体中已安装的模块的控制器, 模块被当成小应用主体来看待,
和应用主体不同的是, 模块不能单独部署,必须属于某个应用主体。
目录结构.
├── assets
├── components
├── config
├── controllers
├── messages
├── models
├── modules #### 模块目录
└── redactor #### 这就是redactor模块,其下有模型,视图,控制器等。
├── views
├── actions
├── controllers
├── models
├── config.php
└── RedactorModule.php
├── runtime
├── views
└── web
创建模块
我们已经看到在模块redactor目录下, 有 controllers (控制器), models(模型), views(试图) 和应用非常相似。这就组成了一个模块的基本单元。
下面让我们来分解一下:
模块类
RedactorModule.php 就是模块的模块类文件,模块类都要继承 yii\base\Module。该文件直接放在模块的basepath下,并且会被自动加载。
当模块类被访问和应用主题一样,会创建该模块的唯一实例,并为模块内代码共享数据和组件。<?php
namespace app\modules\admin;
use yii\base\Module;
/**
* Admin module definition class
*/
class RedactorModule extends Module
{
/**
* @inheritdoc
*/
public $controllerNamespace = 'app\modules\redactor\controllers';
/**
* @inheritdoc
*/
public function init()
{
parent::init();
// 从config.php 加载模块配置
\Yii::configure($this, require __DIR__ . '/config.php');
}
}
controllers(控制器)<?php
namespace app\modules\redactor\controllers;
class UploadController extends \yii\web\Controller
{
public $enableCsrfValidation = false;
public function behaviors()
{
return [
[
'class' => 'yii\filters\ContentNegotiator',
'formats' => [
'application/json' => Response::FORMAT_JSON
],
]
];
}
public function actionsFile()
{
//上传文件
}
}
models (模型)<?php
namespace backend\modules\redactor\models;
use Yii;
use yii\web\UploadedFile;
use yii\helpers\Inflector;
class FileUploadModel extends \yii\base\Model
{
public $file;
private $_fileName;
public function rules()
{
return [
['file', 'file', 'extensions' => Yii::$app->controller->module->fileAllowExtensions]
];
}
public function upload()
{
if ($this->validate()) {
return $this->file->saveAs(Yii::$app->controller->module->getFilePath($this->getFileName()), true);
}
return false;
}
....
}
由于上传文件模块是提供的上传功能集成在其他页面使用这里不做视图展示。
配置模块
模块创建完成以后 ,打开应用的配置文件 ./config/main.php 在modules下添加模块配置,这样我们就可以通过url来使用模块的功能了。'bootstrap' => ['log'],
'modules' => [
'redactor' => [
'class' => 'app\modules\redactor\RedactorModule',
],
],
'language'=> 'zh-CN',
'components' => [],
访问
访问之前记得做url美化。http://hostname/redactor/upload/file