【译】CodeIgniter HMVC模块扩展使用文档

CodeIgniter HMVC扩展说明

原文地址:Modular Extensions - HMVC

模块扩展——HMVC

模块扩展让CodeIgniter框架模块化。模块是一组独立的组件(通常有模型、控制器和视图),它们被分类在应用模块的子文件夹中,并且能够直接拖到其他的CodeIgniter应用中。

HMVC的意思是分层模型视图控制器。

模块控制器能够作为普通的控制器或者HMVC控制器使用,它们也能够被当做小部件帮助你开发一部分视图。

模块扩展安装

  1. 安装纯净的CI框架

  2. 设置$config['base_url']变量

  3. 访问URL /index.php/welcome看到欢迎界面

  4. 将模块扩展的third_party文件拖入application/third_party目录

  5. 将模块扩展的core文件放入application/core目录,MY_Controller.php文件可以不放进去,除非你想自己写一个你自己的控制器继承

  6. 访问URL /index.php/welcome看到欢迎界面

  7. 创造模块目录结构application/modules/welcome/controllers

  8. 将控制器文件application/controllers/welcome.php移动至application/modules/welcome/controllers/welcome.php

  9. 访问URL /index.php/welcome看到欢迎界面

  10. 创建目录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前

使用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”类不同之处在于:

  1. 不需要在HMVC中获取和使用CI实例

  2. HMVC类存储在modules目录中而不是类库目录中

Q: 模块扩展HMVC和模块分离是一样的么?

A: 是,也可以说不是。和模块分离类似,模块扩展使得模块变得“可便携的”。例如,如果你有一个漂亮的自包含MVC文件集,你能够将你的MVC文件加入到另一个项目中,仅仅通过复制一个目录就行了。所有文件都在同一个地方而不是散布在modelviewcontroller文件夹。

模块化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, $...); ?>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python函数参数类型及顺序_python函数参数类型及其顺序

根据inspect模块官文文档中关于函数参数类型的相关说明&#xff0c;python函数参数共有五种类型&#xff0c;按顺序分别为&#xff1a;POSITIONAL_ONLY、POSITIONAL_OR_KEYWORD、VAR_POSITIONAL、KEYWORD_ONLY、VAR_KEYWORD。如图&#xff1a;POSITIONAL_ONLY&#xff1a;参数值…

JS组件系列——Bootstrap Table 表格行拖拽(二:多行拖拽)

原文:JS组件系列——Bootstrap Table 表格行拖拽&#xff08;二&#xff1a;多行拖拽&#xff09;前言&#xff1a;前天刚写了篇JS组件系列——Bootstrap Table 表格行拖拽&#xff0c;今天接到新的需要&#xff0c;需要在之前表格行拖拽的基础上能够同时拖拽选中的多行。博主用…

scrapy知乎爬虫mysql存储项目_Scrapy爬虫框架第八讲【项目实战篇:知乎用户信息抓取】--本文参考静觅博主所写...

思路分析&#xff1a;(1)选定起始人(即选择关注数和粉丝数较多的人--大V)(2)获取该大V的个人信息(3)获取关注列表用户信息(4)获取粉丝列表用户信息(5)重复(2)(3)(4)步实现全知乎用户爬取实战演练&#xff1a;(1)、创建项目&#xff1a;scrapy startproject zhijutest(2)、创建爬…

kali下生成web端后门

很多时候在***测试时选择web***害怕用的别人的马带有后门&#xff0c;这样自己的辛苦就要被别人不劳而获&#xff0c;很多时候我们都想拥有自己的马&#xff0c;那么这个时候你就应该使用kail来生成一个自己独特密码的web***了。Kali Linux自带有好几个web***生成工具&#xff…

素性测试的Miller-Rabin算法完全解析 (C语言实现、Python实现)

因为文中存在公式&#xff0c;只能用图片方式上传了&#xff01; 以下为C语言源代码&#xff1a; #include <stdio.h> typedef long long unsigned LLU; typedef int BOOL; #define TRUE 1 #define FALSE 0 BOOL isPrime(LLU n) { //这是传统的方法&#xff0c;用于与…

MongoDB源码阅读之ReplSet源码分析

1. ReplSet源码结构 rs_config.h replSet间同步设置的工具类 rs_member.h 心跳检测类和replSet成员状态的定义 rs_sync.h 同步数据类 rs.h 定义了几乎所有replSet相关的类&#xff08;Member:replSet中的节点成员&#xff0c; GhostSync&#xff1a;备份同步类&#xff0c;Rep…

C# 字符串性能

Written By Dr Herbie [2] Translated By Allen Lee Introduction 你在代码中处理字符串的方法可能会对性能产生令人吃惊的影响。程序中需要考虑两个由于使用字符串而产生的问题&#xff1a;临时字符串变量的使用和字符串连接。Background1.String是引用类型&#xff0c;在堆上…

手把手教你部署VSAN见证虚拟设备 (Cormac)

译者注&#xff1a;本文翻译自Cormac的博客&#xff0c;并未严格地逐字逐句的直译&#xff0c;如有谬误&#xff0c;万望见谅。原文见此http://cormachogan.com/2015/09/14/step-by-step-deployment-of-the-vsan-witness-appliance/现在开始在之前的帖子中我曾经介绍过见证虚拟…

PyCharm编程环境的中英文字体分别设置的好处多----一石三鸟地解决中文字体不一致、英文字体不涵盖中文字符、编程字体实用性兼顾美观性的三个问题

在编程环境&#xff08;例如Python的PyCharm&#xff09;中&#xff0c;我们希望编程环境的字体具有如下特性&#xff1a; &#xff08;1&#xff09;字体覆盖中文和英文字符。 &#xff08;2&#xff09;等宽字体&#xff0c;并且是TrueType字体&#xff0c;方便辨识代码中缩…

WordPress博客系统的安全

随着计算机网络的流行&#xff0c;越来越多的人开始创建自己的博客&#xff0c;论起博客系统&#xff0c;全球用的最多的博客系统就是wordpress&#xff08;以下简称WP&#xff09;。但是如果用过WP的人都应该知道&#xff0c;WP的站点想要做的好看&#xff0c;插件是必不可少的…

mysql为什么行数据库_关系数据表中的行称为什么?

在一个二维表中&#xff0c;水平方向的行称为元组&#xff0c;每一行是一个元组&#xff1b;元组对应表中的一个具体记录。数据元组也称为记录。一个数据表中的每一个记录均有一个惟一的编号(记录号)。一个记录也就是数据表中的一行。元组(tuple)是关系数据库中的基本概念&…

maven安装以及eclipse配置maven

http://jingyan.baidu.com/article/295430f136e8e00c7e0050b9.html 必须先下载并安装JDK&#xff0c;配置JDK的环境变量JAVA_HOME&#xff0c;否则maven将无法使用 eclipse安装maven插件后必须重新定位maven到本地maven目录 如下定位&#xff1a; 为了使得Eclipse中安装的Maven…

JS 问题集锦

【1】js页面跳转 和 js打开新窗口方法 第一种&#xff1a;<script language"javascript" type"text/javascript">window.location.href"http://www.xlfun.com/login.php?backurl"window.location.href; </script>第二种&#xff1a…

重温Observer模式--热水器·改(转载)

引言 在 C#中的委托和事件 一文的后半部分&#xff0c;我向大家讲述了Observer(观察者)模式&#xff0c;并使用委托和事件实现了这个模式。实际上&#xff0c;不使用委托和事件&#xff0c;一样可以实现Observer模式。在本文中&#xff0c;我将使用GOF的经典方式&#xff0c;再…

龙图 VP 李翀:数据化运营及云计算下的运维

文 | 龙图 VP 李翀原文地址&#xff1a;当游戏遇上大数据和云计算——谈数据化运营及云计算下的运维龙图做了8年的游戏&#xff0c;真正快速发展起来是在移动互联网这个时代。随着刀塔快速的扩张&#xff0c;我们在各个领域都遇到了非常多的之前没有想到过的状态。发现云计算其…

鼠标移动时,光标相对于对象的位置

鼠标在一个物体上移动时&#xff0c;能够计算出光标相对于任何其它对象的相对位置。 Code<Grid x:Name"LayoutRoot" Background"White"> <Grid HorizontalAlignment"Left" VerticalAlignment"Top" Name"grid1&q…

怎么判断一个字符串的最长回文子串是否在头尾_【Leetcode每日打卡】最长回文串...

干货预警&#xff1a;所有文章都会首发于我的公众号【甜姨的奇妙冒险】&#xff0c;欢迎watch。一、来历&#xff1a;力扣从3月开始开启了每日一题打卡活动&#xff0c;于是跟风加入了打卡大军&#xff0c;这两天写评论、发题解&#xff0c;没想到反响还不错&#xff0c;收到了…

.NET平台下WEB应用程序的部署(安装数据库和自动配置)

.NET平台下WEB应用程序的部署(安装数据库和自动配置)李洪根在.NET平台下&#xff0c;部署 Web 解决方案是比较方便的。我们可以利用Visual Studio.NET 2003添加一个WEB安装项目&#xff0c;在部署的“文件系统编辑器”中添加项目的主输出和内容文件&#xff0c;非常简易地完成安…

苹果原壁纸高清_全面屏壁纸高清 | 电影经典台词截图高清

iPhonex手机壁纸高清(苹果xs壁纸&#xff0c;苹果xr壁纸&#xff0c;iPhone11壁纸&#xff0c;安卓全屏壁纸)火影壁纸高清&#xff0c;经典电影台词截图拼接壁纸&#xff0c;电影《去他妈的世界》壁纸&#xff0c;欧美电影截图加上经典台词&#xff0c;2020好看的手机壁纸&…