【译】CodeIgniter HMVC模块扩展使用文档
CodeIgniter HMVC扩展说明
原文地址:Modular Extensions - HMVC
模块扩展——HMVC
模块扩展让CodeIgniter框架模块化。模块是一组独立的组件(通常有模型、控制器和视图),它们被分类在应用模块的子文件夹中,并且能够直接拖到其他的CodeIgniter应用中。
HMVC的意思是分层模型视图控制器。
模块控制器能够作为普通的控制器或者HMVC控制器使用,它们也能够被当做小部件帮助你开发一部分视图。
模块扩展安装
安装纯净的CI框架
设置
$config['base_url']
变量访问URL
/index.php/welcome
看到欢迎界面将模块扩展的
third_party
文件拖入application/third_party
目录将模块扩展的
core
文件放入application/core
目录,MY_Controller.php
文件可以不放进去,除非你想自己写一个你自己的控制器继承访问URL
/index.php/welcome
看到欢迎界面创造模块目录结构
application/modules/welcome/controllers
将控制器文件
application/controllers/welcome.php
移动至application/modules/welcome/controllers/welcome.php
访问URL
/index.php/welcome
看到欢迎界面创建目录
application/modules/welcome/views
11. 将视图文件application/views/welcome_message.php
移动至application/modules/welcome/views/welcome_message.php
12. 访问URL /index.php/welcome
看到欢迎界面
你现在应该拥有了一个正在运行的模块扩展了。
译者注:
为了便于大家理解HMVC,我这里展示使用HMVC前和使用HMVC后的目录结构
使用HMVC前:
使用HMVC后:
安装提示
第1~3步告诉你如何安装一个标准的CI框架,如果你已经安装了,跳至步骤4
第4~5步告诉你普通的CI框架在安装了MX之后仍然正常运行,它不应该打断正常的CI框架安装
第6~8步说明MX和CI控制器一起正常工作,控制器被移入
welcome
模块,视图文件仍在CI的application/views
目录,MX能够在好几个地方发现模块资源,包括应用目录第9~11步说明MX和在
welcome
模块中的控制器以及视图一起工作,在application/controllers
以及application/views
目录中此时应该没有文件了。
FAQ
Q: 什么是模块?我为什么要使用他们?
A: 参见维基百科:
http://en.wikipedia.org/wiki/Module)
http://en.wikipedia.org/wiki/Modular_programming)
http://blog.fedecarg.com/2008/06/28/a-modular-approach-to-web-development)
Q: 什么是模块化HMVC,为什么我应该使用它?
A: 模块化 HMVC = Multiple MVC triads
当你需要载入视图和视图中的数据的时候,这将是非常有用的。考虑添加一个购物车到一个页面中,这个购物车需要它自己的控制器,这个控制器要调用一个模型来获取购物车数据。然后控制器需要将数据载入到视图中。因此,和在主控制器处理这个页面和购物车不同,购物车MVC能够直接在页面中加载。这个主控制器不需要知道购物车MVC,并且和购物车MVC是完全隔离的。
在CI框架中,我们不能够在一次请求中调用多个控制器。因此,为了实现HMVC,我们不得不模拟控制器的行为。这用类库可以做到或者使用这个“模块扩展HMVC”。
使用一个类库和一个“模块扩展HMVC”类不同之处在于:
不需要在HMVC中获取和使用CI实例
HMVC类存储在
modules
目录中而不是类库目录中
Q: 模块扩展HMVC和模块分离是一样的么?
A: 是,也可以说不是。和模块分离类似,模块扩展使得模块变得“可便携的”。例如,如果你有一个漂亮的自包含MVC文件集,你能够将你的MVC文件加入到另一个项目中,仅仅通过复制一个目录就行了。所有文件都在同一个地方而不是散布在model
、view
和controller
文件夹。
模块化HMVC意味着模块化MVC triads。 模块分离和模块扩展让相关的控制器、模型、类库、视图等等文件能够被打包在模块子目录中,并且能够像一个小型应用那样使用。但是,模块扩展更进一步,它允许这些模块互相通信。你能够不用通过与http交互得到控制器的输出内容。
特点
所有的控制器都包含一个$autoload
类变量,这个类变量拥有一个运行时优先载入的条目(item)数组。这个功能能够和 module/config/autoload.php
一起使用,然而,使用$autoload
变量仅仅在对应的控制器中起作用。
<?php
class Xyz extends MX_Controller
{$autoload = array('helper' => array('url', 'form'),'libraries' => array('email'),);
}
Modules::$locations
可以在application/config.php
文件中设置,例如:
<?php
$config['modules_locations'] = array(APPPATH.'modules/' => '../modules/',
);
Modules::run()
输出将会被缓存,因此从任何从控制器返回或者输出的数据将会被捕获并且返回到调用者。特别的,$this->load->view()
能够在一个普通的控制器中按照你所想的那样使用,而不用返回任何值。
控制器能够作为别的控制器的类变量载入,使用语句$this->load->module('module/controller');
或者在控制器的名称和模块的名称一致的时候,使用$this->load->module('module');
任何加载的模块都可以当做一个类库使用,例如$this->controller->method()
,但是加载的模块拥有自己独立与调用它的类的模块和类库。
所有模块控制器都能够通过URL( module/controller/method
或者模块名和控制器名称一致的时候使用module/method
)访问到。如果你添加了_remap()
方法到你的控制器中,你能够阻止不需要的访问然后重定向或者发送一个错误,这些随你。
注意:
要使用HMVC功能,例如Modules::run()
,控制器必须继承MX_Controller
类。
仅仅使用分开的模块而不是HMVC功能,控制器可以继承CodeIgniter类。
你必须在控制器中使用PHP5样式的构造函数,例如:
<?php
class Xyz extends MX_Controller
{function __construct(){parent::__construct();}
}
构造函数并不是必须的,除非你想在控制器创建的时候载入或者处理什么东西。
所有的MY_extension
类库应该包含(需要)他们同等的MX类库文件,并且继承它们同等的MX_class
。
每一个模块可以包含一个config/routes.php
文件,在文件中定义该模块的路由和默认控制器:
<?php
$route['module_name'] = 'controller_name';
控制器可以从application/controllers
子目录中载入。
控制器也可以从module/controllers
子目录中载入。
资源能够能够跨控制器载入,例如: $this->load->model('module/model');
Modules::run()
被设计成返回部分视图,并且它将会从控制器返回缓存输出(一个视图)。使用modules::run
语法是一个URI类型的片段字符串和无限的变量。
<?php
/** module and controller names are different, you must include the method name also, including 'index' **/
modules::run('module/controller/method', $params, $...);/** module and controller names are the same but the method is not 'index' **/
modules::run('module/method', $params, $...);/** module and controller names are the same and the method is 'index' **/
modules::run('module', $params, $...);/** Parameters are optional, You may pass any number of parameters. **/
在控制器里边调用一个模块控制器,你可以使用$this->load->module()
或者Modules::load()
,PHP5的方法链也可以用在任何被MX加载的对象中,例如: $this->load->library(‘validation’)->run()
。
载入模块的语言文件推荐使用载入方法,该方法将会传递一个激活的模块名称到一个语言实例,例如:$this->load->language('language_file');
PHP5的spl_autoload
特性允许你自由地扩展你的控制器、模块和来自application/core
或者application/libraries
基本类的的类库,不需要考虑显式包含他们。
类库加载器也被更新从而适应一些CI的特性,例如:类库别名能够和模块别名一样的方式接受,并且从模块配置目录中载入配置文件作为类库的参数(例如:form_validation.php
),这项特性也被加了进来。
$config = $this->load->config(‘config_file’)
,返回已加载的数组到变量中。
模块和类库也能够从他们各自的应用目录的子目录中加载。
在用MX使用表单验证时,你将需要继承CI_Form_validation
类,如下所示:
<?php
/** application/libraries/MY_Form_validation **/
class MY_Form_validation extends CI_Form_validation
{public $CI;
}
在将目前的控制器作为$CI变量赋值给表单验证类库之前。这将让你的回调函数正常工作。
<?php
class Xyz extends MX_Controller
{function __construct(){parent::__construct();$this->load->library('form_validation');$this->form_validation->CI =& $this;}
}
部分视图
使用模块作为视图的一部分在一个视图中使用是很容易的:
<?php echo Modules::run('module/controller/method', $param, $...); ?>
【译】CodeIgniter HMVC模块扩展使用文档相关推荐
- layui弹出层:皮肤扩展(文档解读)
layui弹出层:皮肤扩展(文档解读) layui弹出层:样式自定义 官方文档:https://layer.layui.com/ 皮肤扩展 · 官方教程: 官方文档:https://layer.lay ...
- Python-docx 模块读写 Word 文档基础(一):创建文档、段落格式、字体格式设置方法
Python-docx 模块读写 Word 文档基础(一):创建文档.段落格式.字体格式设置方法 前言: 1.创建 Word 文档及基础用法: 2.段落格式设置: 3.字体格式设置: 结尾: [Pyt ...
- python安装模块(官网文档)
https://docs.python.org/zh-cn/3/tutorial/venv.html# https://packaging.python.org/tutorials/installin ...
- python 如何查看模块所有方法-Python 查看模块的帮助文档,方法和帮助信息
参考链接:https://blog.csdn.net/u013810296/article/details/55509284 这里介绍下python自带的查看帮助功能,可以在编程时不中断地迅速找到所需 ...
- python 查看已经安装的模块_教你用Python查看模块的帮助文档,方法和帮助信息...
这里介绍下python自带的查看帮助功能,可以在编程时不中断地迅速找到所需模块和函数的使用方法 查看方法 通用帮助函数help() python中的help()类似unix中的man指令,熟悉后会对我 ...
- 快速扩展在线文档产品特性的9个开源项目
在线文档,笔记应用近几年发展迅速,这些产品的内容创造与管理也不再仅仅局限于文字或者图片,诸如科学公式,多维表格,流程图,思维导图,电子表格等元素也逐步被引入文档内容中. 而这些元素的编辑与展示在各个特 ...
- FI模块组织机构配置文档
SAP的FI模块组织机构的配置由定义和分配两大部组成. 定义部分: 定义公司代码(Company Code) 定义公司(Company) 定义科目表(Chart of Accounts) 定义字段状态 ...
- 精易模块保存html文档,精易模块6.60源码
资源介绍: 精易模块 V6.6.0 what's new: (20180801) 一.新增 1.新增"数组_寻找数组"查找一个数组里有没有该元素或者该元素的下标:感谢[@挥剑い为红 ...
- 水晶报表各版本打包模块及相关文档
官方站点 http://support.businessobjects.com/fix/merge_modules.asp 推荐使用InstallShield打包工具. 转载于:https://www ...
最新文章
- Linq 集合处理(Union)
- JVM GC一次调优实战
- 在ASP.NET MVC 4中使用Kendo UI Grid
- 预编译指令与相关宏小结
- Android之实现多桌面图标app入口进入不同的页面,像2个独立运行的app一样,互不干扰。
- 应用程序进程启动过程
- 基于OpenCV实现------图像的转置
- isSelected() 的使用
- linux中cp: omitting directory `XXX' 问题解决
- ios VM snapshot invalid and could not be inferred from settings
- android控件显示在最上层,「总是可见的时钟和备忘录」永远显示在屏幕最上层的贴心助手(Android)...
- 车间生产管理系统严格管控生产全过程?7大步骤分享
- 无偏性、有效性、一致性
- 从0到N建立高性价比的大数据平台
- 远程访问服务器Jupyter Notebook的两种方法
- 软件测试实战项目,问题答疑
- 如何有效预防XSS?这几招管用
- HDU1179 Ollivanders
- 东莞市电子计算机学校,东莞市电子科技学校
- 补偿电容器串联电抗对无源LC滤波器性能的影响