php yii2模块,模块(Modules)
模块
模块是独立的软件单元,由模型, 视图, 控制器和其他支持组件组成, 终端用户可以访问在应用主体中已安装的模块的控制器, 模块被当成小应用主体来看待,和应用主体不同的是, 模块不能单独部署,必须属于某个应用主体。
创建模块
模块被组织成一个称为yii\base\Module::basePath的目录, 在该目录中有子目录如controllers, models, views 分别为对应控制器,模型,视图和其他代码,和应用非常类似。 如下例子显示一个模型的目录结构:
forum/
Module.php 模块类文件
controllers/ 包含控制器类文件
DefaultController.php default 控制器类文件
models/ 包含模型类文件
views/ 包含控制器视图文件和布局文件
layouts/ 包含布局文件
default/ 包含DefaultController控制器视图文件
index.php index视图文件
模块类
每个模块都有一个继承yii\base\Module的模块类,该类文件直接放在模块的yii\base\Module::basePath目录下, 并且能被 自动加载。当一个模块被访问,和 应用主体实例 类似会创建该模块类唯一实例,模块实例用来帮模块内代码共享数据和组件。
以下示例一个模块类大致定义:
namespace app\modules\forum;
class Module extends \yii\base\Module{
public function init(){
parent::init();
$this->params['foo'] = 'bar';
// ... 其他初始化代码 ...
}
}
如果 init() 方法包含很多初始化模块属性代码, 可将他们保存在配置 并在init()中使用以下代码加载:
public function init(){
parent::init();
// 从config.php加载配置来初始化模块
\Yii::configure($this, require(__DIR__ . '/config.php'));
}
config.php配置文件可能包含以下内容,类似应用主体配置.
'components' => [
// list of component configurations
],
'params' => [
// list of parameters
],
];
模块中的控制器
创建模块的控制器时,惯例是将控制器类放在模块类命名空间的controllers子命名空间中, 也意味着要将控制器类文件放在模块yii\base\Module::basePath目录中的controllers子目录中。 例如,上小节中要在forum模块中创建post控制器,应像如下申明控制器类:
namespace app\modules\forum\controllers;
use yii\web\Controller;
class PostController extends Controller{
// ...
}
可配置yii\base\Module::controllerNamespace属性来自定义控制器类的命名空间, 如果一些控制器不再该命名空间下,可配置yii\base\Module::controllerMap属性让它们能被访问, 这类似于 应用主体配置 所做的。
模块中的视图
视图应放在模块的yii\base\Module::basePath对应目录下的 views 目录, 对于模块中控制器对应的视图文件应放在views/ControllerID 目录下, 其中ControllerID对应 控制器 ID. For example, if 例如,假定控制器类为PostController,目录对应模块yii\base\Module::basePath目录下的 views/post 目录。
模块可指定 布局,它用在模块的控制器视图渲染。 布局文件默认放在 views/layouts 目录下,可配置yii\base\Module::layout属性指定布局名, 如果没有配置 layout 属性名,默认会使用应用的布局。
使用模块
要在应用中使用模块,只需要将模块加入到应用主体配置的yii\base\Application::modules属性的列表中, 如下代码的应用主体配置 使用forum 模块:
[
'modules' => [
'forum' => [
'class' => 'app\modules\forum\Module',
// ... 模块其他配置 ...
],
],
]
yii\base\Application::modules 属性使用模块配置数组,每个数组键为模块 ID, 它标识该应用中唯一的模块,数组的值为用来创建模块的配置。
路由
和访问应用的控制器类似,路由 也用在模块中控制器的寻址, 模块中控制器的路由必须以模块ID开始,接下来为控制器ID和操作ID。 例如,假定应用使用一个名为 forum 模块,路由forum/post/index 代表模块中 post 控制器的 index 操作, 如果路由只包含模块ID,默认为 default 的yii\base\Module::defaultRoute 属性来决定使用哪个控制器/操作, 也就是说路由 forum 可能代表 forum 模块的default 控制器。
访问模块
在模块中,可能经常需要获取模块类的实例来访问模块ID,模块参数,模块组件等, 可以使用如下语句来获取:
$module = MyModuleClass::getInstance();
其中 MyModuleClass 对应你想要的模块类,getInstance() 方法返回当前请求的模块类实例, 如果模块没有被请求,该方法会返回空,注意不需要手动创建一个模块类,因为手动创建的和Yii处理请求时自动创建的不同。
补充: 当开发模块时,你不能假定模块使用固定的ID,因为在应用或其他没模块中,模块可能会对应到任意的ID, 为了获取模块ID,应使用上述代码获取模块实例,然后通过$module->id获取模块ID。
也可以使用如下方式访问模块实例:
// 获取ID为 "forum" 的模块$module = \Yii::$app->getModule('forum');
// 获取处理当前请求控制器所属的模块$module = \Yii::$app->controller->module;
第一种方式仅在你知道模块ID的情况下有效,第二种方式在你知道处理请求的控制器下使用。
一旦获取到模块实例,可访问注册到模块的参数和组件,例如:
$maxPostCount = $module->params['maxPostCount'];
引导启动模块
有些模块在每个请求下都有运行, yii\debug\Module 模块就是这种, 为此将这种模块加入到应用主体的 yii\base\Application::bootstrap 属性中。
例如,如下示例的应用主体配置会确保debug模块每次都被加载:
[
'bootstrap' => [
'debug',
],
'modules' => [
'debug' => 'yii\debug\Module',
],
]
模块嵌套
模块可无限级嵌套,也就是说,模块可以包含另一个包含模块的模块,我们称前者为父模块,后者为子模块, 子模块必须在父模块的yii\base\Module::modules属性中申明,例如:
namespace app\modules\forum;
class Module extends \yii\base\Module{
public function init(){
parent::init();
$this->modules = [
'admin' => [
// 此处应考虑使用一个更短的命名空间
'class' => 'app\modules\forum\modules\admin\Module',
],
];
}
}
在嵌套模块中的控制器,它的路由应包含它所有祖先模块的ID,例如forum/admin/dashboard/index 代表 在模块forum中子模块admin中dashboard控制器的index操作。
最佳实践
模块在大型项目中常备使用,这些项目的特性可分组,每个组包含一些强相关的特性, 每个特性组可以做成一个模块由特定的开发人员和开发组来开发和维护。
在特性组上,使用模块也是重用代码的好方式,一些常用特性,如用户管理,评论管理,可以开发成模块, 这样在相关项目中非常容易被重用。
php yii2模块,模块(Modules)相关推荐
- Python: 第三方模块(modules)的安装位置 (2014-08-24 23:19:18)转载▼ 标签: site-packages dist-packages 默认安装目录 分类: Pyth
Python: 第三方模块(modules)的安装位置 在默认情况下,Python的module的默认安装目录是 /usr/local/lib/pythonX.Y/site-packages.例如,我 ...
- python用什么来写模块-Python常用模块——模块介绍与导入
Python常用模块--模块介绍与导入 一.什么是模块? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分 ...
- dedemodule.class.php,DEDECMS5.7模块/模块管理列表显示空白问题解决方法
DEDECMS5.7模块/模块管理列表显示空白(站长基地配图) 今天站长基地升级至dedecms最新版本,进入后台意外的发现,模块/模块管理一片空白,但有没有及时备份,于是赶紧去网上找寻解决办法,经过 ...
- java 多模块模块变灰色_到底谁需要Java模块?
java 多模块模块变灰色 拼图问题为1000.我作为X想要JPMS模块. 如果不是平台开发人员,X是什么? 我的回答是X是人(减去平台开发人员,因为那是一个条件) . 我们都需要模块系统具有更安全的 ...
- [运维笔记] PowerShell (模块).模块清单
[运维笔记] PowerShell (模块).模块清单 作者:jcLee95 目 录 1. 模块清单是什么 2. 如何创建模块清单 3. 模块清单.psd1文件内容解释 4. 某库的模块清单实例 1. ...
- 每个python文件就是一个模块、模块的名字就是_每个Python文件都可以作为一个模块,模块的名字就是 的名字_学小易找答案...
[单选题]9.3 The management of XYZ Co has annual credit sales of $20 million and accounts receivable of ...
- python 多层包多模块_python Modules模块操作
今天学习python的Modules模块操作,并记录学习过程欢迎大家一起交流分享. 首先新建一个python文件命名为my_module.py的自定义moudle文件,在这个文件中进行模块代码编写: ...
- 详解Python模块化——模块(Modules)和包(Packages)
文章目录 引言 Python Modules模块 导入模块 ①导入整个模块 ②导入模块中的特定函数 ③导入模块中的所有函数 给导入的模块一个别名 单独运行模块 加速模块加载 Python Packag ...
- 如何开发React Native 原生模块(Native Modules)?看完这篇文章就够了(Android)
期待已久的新课上线啦!解锁React Native开发新姿势,一网打尽React Native最新与最热技术,点我Get!!! 前言 一直想写一下我在React Native原生模块封装方面的一些经验 ...
最新文章
- Ajax基础和Json基础
- App-V 4.6 SP1系列之五包加速器的制作
- 20135202闫佳歆--week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程--实验及总结...
- QML工作笔记-为TestField戴上皮肤
- c语言如何答应出数所在数组的下标_零基础学C语言——数组
- Kafka+Log4j实现日志集中管理
- mysql_提示 Lock wait timeout exceeded解决办法
- javafx button按钮分组突出选中按钮(ToggleButton)
- WebGrid 在asp.net mvc中的使用和理解(译)
- LYNC 2010 中文测试版已经可以下载
- 华东师范大学计算机考研资料汇总
- MySQL按日期依次统计
- 蔡松龙---小白羊餐饮
- 发音到底是 /s/ 还是 /z/ ?
- android开发笔记之属性动画
- MyEclipse/Eclipse 导出带目录结构的.class
- JavaScript 对象增删改查 + 遍历对象+内置函数 + 随机对象
- 程序员的日常|秃头?不存在的,这辈子都不可能秃头!
- Ehome/ISUP协议海康设备的主动注册管理
- 猿创征文|一文吃透JAVA初学者的开发工具