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

在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

Codeigniter 3 拓展HMVC相关推荐

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

    CodeIgniter HMVC扩展说明 原文地址:Modular Extensions - HMVC 模块扩展--HMVC 模块扩展让CodeIgniter框架模块化.模块是一组独立的组件(通常有模 ...

  2. CodeIgniter框架解析

    转载于:https://www.cnblogs.com/xiaoxiaoqingyi/p/6901654.html 转载仅为以后自己学习. 业余花了点时间看看CodeIgniter框架(简称CI),C ...

  3. 左神讲算法——二分法及其拓展

    目录 1. 经典二分例题 2. 拓展例题一:寻找大于等于某数最左侧位置 3. 拓展例题二:局部最小值问题 参考链接:2021最新左神数据结构算法全家桶 1. 经典二分例题 题目一:在一个有序数组中,找 ...

  4. SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...

  5. 拓展ARM研发进展与玩家

    拓展ARM研发进展与玩家 根据EETimes 分析师Colin Barnden的预测,Apple Car将搭载基于ARM架构的C1芯片,并支持眼球追踪等AI功能.新造车势力高通.Nvidia以及海思, ...

  6. pip安装拓展包--网络超时/Read timed out问题

    pip安装拓展包--网络超时/Read timed out问题 解决方案:切换镜像源(墙皮太厚) 在后面加上: -i https://pypi.douban.com/simple example: p ...

  7. php定义常量mypi 3.14,php – Codeigniter 3使用未定义的常量VIEWPATH – 假设’VIEWPATH’...

    我使用Codeigniter 3构建了一个系统,出于某种原因,只有一些用户正在使用白屏.我正在尝试调试它并且已启用日志记录. 我的日志中出现以下错误: Severity: Notice --> ...

  8. php ci 调用控制器,如何从Codeigniter中的另一个控制器加载一个控制器?

    小编典典 您无法从CI中的控制器加载控制器-除非您使用HMVC或其他工具. 您应该考虑一下您的体系结构.如果需要从另一个控制器调用一个控制器方法,则可能应该将该代码抽象到帮助程序或库中,并从两个控制器 ...

  9. 火狐拓展开发 基础知识

    平时经常碰到一些零碎的知识,或者其他什么好文章/知识点/插件/库等等,因为实在太多书签已插乱...于是想着干脆写个火狐小add-on. 首先找到了这里ADD-ON SDK: Using the Add ...

最新文章

  1. java 反射机制_Java反射机制原理探究
  2. FPGA的设计艺术(2)FPGA开发流程
  3. http协议基础(七)通用首部字段
  4. 互联网协议 — 使用 Wireshark 调试 HTTPS 及 HTTP/2 流量
  5. 区块链死亡项目列表小程序:死亡硬币
  6. Gotchas 44-引用和临时对象
  7. 导出toolStrip1中的图标
  8. 多线程:Vector是线程安全的吗
  9. java uncked_使用FindBugs对SpringSide1.0m3进行分析的结果
  10. 在mac中导入hadoop2.6.0源代码至eclipse
  11. Javascript面向对象研究心得
  12. MySQL8.0——Resource Group(资源组)
  13. VSCode USER GUIDE Basic Editing
  14. Pycharm 和 Vs code 字体大小调整(Ctrl + 鼠标滚轮实现)
  15. Gstreamer离线版官方文档(十五)
  16. spring学习--完全注解开发(不需要xml)
  17. MATLAB拟合算法
  18. 51单片机用C语言实现交通灯(红绿灯)源程序实训QY-KP1
  19. 数据库系统设计大作业:图书馆管理系统
  20. js 生成二维码(qrcodejs)

热门文章

  1. 笔记整理——linux程序设计
  2. atitit.Oracle 9 10 11 12新特性attilax总结
  3. 黑马程序员-------------(十)Java基础知识加强(一)
  4. 理解面向连接和无连接协议之间的区别
  5. Coolite Toolkit入门指南
  6. 知识点 - 学习过程中积累
  7. 安装ubuntu20.04(安装vim、gcc、VMtools、中文输入法、汉化、修改IP地址)
  8. 全国计算机等级考试题库二级C操作题100套(第42套)
  9. 怎样用计算机算出别人的出生日期,【怀孕出生日期计算器_怀孕出生日期计算器专题】- 天鹅到家...
  10. Vscode如何新建html文件