Codeigniter 3 拓展HMVC

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

在Codeiniter(以下统称CI) 2.X版本中,我们就通过拓展核心类库实现了HMVC,但是同样的代码,拿到CI 3中,就很有可能不好用了。

###拓展核心类库方式

官方的文档对拓展核心类有详细的说明:

你定义的类必须继承自父类。 你的类名和文件名必须以 MY_ 开头。(这是可配置的,见下文) 举个例子,要扩展原始的 Input 类,你需要新建一个文件 application/core/MY_Input.php,然后像下面这样定义你的类:

class MY_Input extends CI_Input {}

CI 控制器加载的过程很简单,官方文档有图如下:

输入图片说明 我们可以看到,在控制器开始加载看,CI是做了Routing(路由)和Security(安全)的操作的,所以,我们需要重写,或者说,在CI拓展我们想要的功能,比如:HMVC

###2.0中扩展

在2.0版本中,笔者曾适用过Jens Segers开源的HMVC模块,代码的实现就是对Routee和Loader进行了重写。 Jens Segers的主页 核心的代码如下:

            if (is_dir($source = $location . $module . '/controllers/')) {$this->module = $module;$this->directory = $relative . $module . '/controllers/';// 根目录下的模块?if ($directory && is_file($source . $directory . '.php')) {$this->class = $directory;return array_slice($segments, 1);}// 子模块?if ($directory && is_dir($source . $directory . '/')) {$source = $source . $directory . '/';$this->directory .= $directory . '/';// 子控制器?if (is_file($source . $directory . '.php')) {return array_slice($segments, 1);}// 子文件夹包含有默认控制器?if (is_file($source . $this->default_controller . '.php')) {$segments[1] = $this->default_controller;return array_slice($segments, 1);}// 子文件夹中的控制器? if ($controller && is_file($source . $controller . '.php')) {return array_slice($segments, 2);}}// 控制器和文件夹名一样?if (is_file($source . $module . '.php')) {return $segments;}// 适用默认的控制器?if (is_file($source . $this->default_controller . '.php')) {$segments[0] = $this->default_controller;return $segments;}}

很简单的拓展 就能实现HMVC模式了,同样的,还得重写Loader中的加载器,不然会找不到文件。

###CI 3 HMVC拓展 到了CI3中,上述方法已经不好用了,CI 3 对路由有了更多的考虑,在初始化路由时,就进行了解析。假设写MY_Ruter类,必须要重写3个方法: CI 2 Router构造

	function __construct(){$this->config =& load_class('Config', 'core');$this->uri =& load_class('URI', 'core');log_message('debug', "Router Class Initialized");}

CI 3 Router构造

public function __construct($routing = NULL){$this->config =& load_class('Config', 'core');$this->uri =& load_class('URI', 'core');$this->enable_query_strings = ( ! is_cli() && $this->config->item('enable_query_strings') === TRUE);is_array($routing) && isset($routing['directory']) && $this->set_directory($routing['directory']);$this->_set_routing();if (is_array($routing)){empty($routing['controller']) OR $this->set_class($routing['controller']);empty($routing['function'])   OR $this->set_method($routing['function']);}log_message('info', 'Router Class Initialized');}

可以看到,在CI3的构造方法中就已经对URL进行解析,方法的调用过程为: _set_routing() -> _validate_request() -> _parse_routes() -> _set_request() 那我们为了要实现HMVC,这几个方法是必然要按照我们自己的方法实现的。 _validate_request 中 我们加入部分验证,即可达到简单的HMVC

 if (is_dir($source = $relative . $module . '/controllers/')) {$this->module = $module;$this->directory =  '../'.$location.$module . '/controllers/';// 如果 有 application/$module/controollers/$directory.php 文件if ($directory && is_file($source . ucfirst($directory) . '.php')) {return array_slice($segments, 1);}//如果application/$module/$directory 是一个文件夹if ($directory && is_dir($source . $directory . '/')) {$source = $source . $directory . '/';$this->directory .= $directory . '/';//  index.php/$modules/$directory/$controller//如果包含 控制器  $controllerif ($controller && is_file($source . ucfirst($controller) . '.php')) {return array_slice($segments, 2);}//如果有默认控制器if (is_file($source . $this->default_controller . '.php')) {$segments[1] = $this->default_controller;return array_slice($segments, 1);}//如果有 application/$module/$directory.phpif (is_file($source . $directory . '.php')) {return array_slice($segments, 1);}}//如果有 application/$module/$module.php  if (is_file($source . $module . '.php')) {return $segments;}// 默认控制器if (is_file($source . $this->default_controller . '.php')) {$segments[0] = $this->default_controller;return $segments;}}

为了让CI_ROUTER知道我们模块拓展的位置,我们在配置文件中加入选项,并在CI_ROUTER的构造器中加入如下代码:

$locations = $this->config->item('modules_locations');if (!$locations) {$locations = array('modules/');} else if (!is_array($locations)) {$locations = array($locations);}$this->config->set_item('modules_locations', $locations);

操作完以上步骤,就可以实现大部分HMVC的拓展了。 本文代码:https://git.oschina.net/liwenlong/Codeigniter-3-HMVC.git 说明:CI3中对控制器大小写由严格的控制了,为了符合CI3的一贯规则,所以我们使用了ucfirst()方式寻找首字母大写的类名,一定要注意。

转载于:https://my.oschina.net/lwl1989/blog/516666

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

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

相关文章

FPGA FIFO深度计算

转自:http://comm.chinaaet.com/adi/blogdetail/37555.html 首先,一定要理解清楚FIFO的应用场景,这个会直接关系到FIFO深度的计算,如果是面试官抛出的问题,那么有不清楚的地方,就应该进行询问。如果是笔试或…

玩转ASP.NET Core 6.0框架-序言

ASP.NET Core是微软提供的强大的web框架,它有很多潜在的强大而有用的功能。本专栏的目标是帮助您把框架的隐藏能力最大限度地发挥出来,让您能够按需定制ASP NET Core框架。本专栏提供了一种具体的操作和实现方法,可以让你在短时间尽可能地提高…

从C#开始的面向对象编程经典自学教程

1、C语言的时代 在C语言时代,可以认为那时的编程过程就是表格加工过程,也就是从A表格到B表格、再到C表格…..等等,这个过程中,计算机语言如何描述一个表格,成为计算机语言的关键。 对一个表格的分析可以发现:表格是两部分组成:表头和表格: 学生表 STUDENT 在这个表格…

Java之对List里面的对象名字进行模糊查询

1 问题 对list里面的对象名字进行模糊查询 2 解决办法 //即可以进行模糊匹配matcher.find()//匹配查询matcher.matches() /*** 模糊查询*/public static ArrayList<SearchBean> search(String name, List<SearchBean> list) {ArrayList<SearchBean> results…

《看聊天记录都学不会Python到游戏实战?太菜了吧》(2)在python中加号竟然如此善变

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

mysql数据库rp集群,使用MySQL-Cluster搭建MySQL数据库集群

1、MySQL集群的作用&#xff1a;- 解决访问节点的单点故障- 数据存储节点的单点故障- 解决数据存储节点数据备份问题2、集群&#xff1a;使用一组服务器提供相同的服务3、关于MySQL-Cluster&#xff1a;MySQL官方提供的集群版本已集成标准版MySQL程序&#xff0c;可独立安装使用…

桌面虚拟化云技术将支撑数字化医院

桌面虚拟化云技术将支撑数字化医院 2013-12-04 10:32 现今医疗行业已经从医院——患者的二元关系走向从医院——患者——政府监督——医疗保险的多元关系&#xff0c;医疗体系需要更高效的运转&#xff0c;患者需要更好的就医体验&#xff0c;这使得医疗行业信息化建设的重要性…

Blazor University (23)路由 —— 路由参数

原文链接&#xff1a;https://blazor-university.com/routing/route-parameters/路由参数源代码[1]到目前为止&#xff0c;我们已经了解了如何将静态 URL 链接到 Blazor 组件。静态 URL 只对静态内容有用&#xff0c;如果我们希望同一个组件根据 URL 中的信息&#xff08;例如客…

【经典回放】多种语言系列数据结构算法:栈(C版)

本文采用C语言实现栈结构算法并举例应用。 一 栈的基本原理分析 作为栈这种数据结构,数据是进行所谓的先进后出操作,但栈在操作中,并不需要在中间插入删除操作、一般也不需要在进栈数据中查找什么,这种情况下,恰恰是顺序表可以完成的非常好的场合,所以栈经常是用一个简单…

Android之提示android.content.res.Resources$NotFoundException: Resource ID #0x7f08010a

1 问题 在我的oppo机器上面运行一个页面没有奔溃,但是在红米安卓5.1版本运行页面奔溃,奔溃信息如下 /Timeline(11600): Timeline: Activity_launch_request time:61313216 I/WtProcessController( 3721): FOREGROUND INFO: name=com.appsinnova.android.keepshare uid=1023…

《看聊天记录都学不会C语言?太菜了吧》(14)这么神奇?我写了20行代码竟然一行就可以搞定?

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖…

Javascript和android原生互调

最近在做原生和js端的互调的功能&#xff0c;自己改了个demo&#xff0c;给大家讲解下。 先上js代码 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>方法调用基本流程测试</title> </head> <body> &l…

ice 服务java连接,“先进的互联互通技术”–使用ice联通php和java [part 1 server]

PHP没有中间件&#xff0c;导致了对很多麻烦。比如&#xff0c;对数据库的操作必须要链接数据库&#xff0c;然后做SQL操作。WEB程序直接操作数据库的方法&#xff0c;这样会带来很多人为因素的事故隐患&#xff0c;以及管理上的麻烦&#xff0c;尤其是对大型的网站应用来说。规…

HttpCookie

参考 : http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html 上文结尾有提到一个说法 4. HttpRequest.Cookies 与 HttpResponse.Cookies 会有关系&#xff08;很奇怪吧&#xff09;。 微软官网也是这么说的 : https://msdn.microsoft.com/en-us/library/system.we…

Android之BaseQuickAdapter.setOnItemChildClickListener点击死人也没反应的原因

1 问题 用BaseQuickAdapter设置子view点击事件 unInstalledAdapter!!.setOnItemChildClickListener(object: BaseQuickAdapter.OnItemChildClickListener {override fun onItemChildClick(adapter: BaseQuickAdapter<*, *>?, view: View?, position: Int) {var info =…

【经典回放】多种语言系列数据结构算法:栈(C#版)

本文采用C#语言实现栈结构算法并举例应用。 一、C#的栈对象使用 对C#而言,要使用栈是极其简单的事情,因为C#已经有栈对象,所以根本不需要自用再用顺序表构造栈,只需要你会说明、会应用即可。 在C#中栈对象的类型名称是Stack,这是个泛型的对象,所以,你在使用这个对象的时…

美国银行将AI应用于企业应收账款处理

据外媒消息&#xff0c;美国银行&#xff08;Bank of America&#xff09;与Fintech创业公司High Radius达成合作&#xff0c;将人工智能应用于企业应收账款处理。该应用程序专为大型、复杂的公司管理大笔支付业务&#xff0c;因这些公司常常发生回款信息丢失或一方单独收到付款…

在 Kubernetes 上部署 Secret 加密系统 Vault

HashiCorp Vault 是一个基于身份的 Secret 和加密管理系统。Secret 是您想要严格控制访问的内容&#xff0c;例如 API 加密密钥、密码或证书。Vault 提供由身份验证和授权方法控制的加密服务。使用 Vault 的 UI、CLI 或 HTTP API&#xff0c;可以安全地存储和管理对机密和其他敏…

《看聊天记录都学不会C语言?太菜了吧》(15)你学了一节课的函数我5分钟搞定了,还很熟

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖…

【经典回放】多种语言系列数据结构算法:栈(JavaScript版)

本文采用JavaScript语言实现栈结构算法并举例应用。 JavaScript的栈是数组对象中自动提供的,这点如同C#,实际也不需要自己编写什么栈的程序,如果你用: var s=new Array(); 定义一个s的数组,则这个s上将有以下的方法可供使用: 其中:FF: Firefox, IE: Internet Explore…