CodeIgniter自定义控制器MY_Controller用法分析


Posted in PHP onJanuary 20, 2016

本文实例讲述了CodeIgniter自定义控制器MY_Controller用法。分享给大家供大家参考,具体如下:

Codeigniter所有的控制器都必须继承CI_Controller类,但CI_Controller类位于system目录下,不太方便修改。为方便做一些公用的处理,通常情况下我们会在core下创建MY_Controller,用来继承CI_Controller,从而项目中所有的控制器继承MY_Controller。

那么,MY_Controller 通常会做些什么呢?

所有的控制器都继承了MY_Controller, MY_Controller常常会加载一些公用帮助函数、公用类库,以及实现一些公用的方法。

公用的方法?公有的方法?

看到这些方法会意识到一个问题,如果方法是public的,那是否可以通过浏览器访问到。答案是可以的!这样不该让用户访问到的方法让用户访问到了。那设置protected吧。。。

备注:CI_Controller中写public方法不会被访问到,框架限制了CI_Controller中方法通过浏览器访问。

随着项目的不断进展,MY_Controller中的公用方法会越来越多。如果此时要增加后台管理的功能,所有的控制器依然继承MY_Controller,那其中的很多方法可能不适用了。如果后台需要的一些公用方法也写在这里,这里将会变得混乱。

如何按模块区分不同的控制器?

有两种处理的方式,第一种是通过不同的公用控制器文件来区分,由控制器去决定继承哪一个公用控制器,当然这里得引入公用文件。还有这种方式是可以通过对象的一个属性来维护,不同的模块赋予该属性不同的对象。如:

<?php 
if ( ! defined('BASEPATH'))
  exit('No direct script access allowed');
class MY_Controller extends CI_Controller
{
 public function __construct($type = NULL)
 {
   parent::__construct();
   switch($type) {
    case 'api' :
     $this->load->library('api_helper', NULL, 'helper');
     break;
    case 'admin' :
     $this->load->library('admin_helper', NULL, 'helper');
      break;
    default :
     $this->load->library('app_helper', NULL, 'helper');
      break
   }
 }
}
/* End of file MY_Controller.php */
/* Location: ./application/core/MY_Controller.php */

控制器调用MY_Controller构造函数并传入type值,根据不同的type值会加载不同的类库,然后给类定义一个统一的别名,方便处理。具体的library可以处理该模块公用的方法或load公用的资源,相当于该模块的一个公用类。当然处理方式也可以是直接通过路由中的目录名或者控制器名称来控制等等。

这样避免了加载不同的文件,调用方法时只需要通过$this->helper对象调用。在仔细看看,可以发现不同模块的公用类是放在library中,放在library或helper中都可以使用get_intance获取控制器对象,但每次使用都需要获取实例,相对麻烦,如果是模型呢?感觉也不太好。其中的公用方法有一些会跟业务逻辑相关,放在library感觉不太合适。

业务逻辑好像并没有一个好的地方去实现,控制器的私有方法?模型?

先总结下上面的处理方法:

1、不同模块之间可以按需加载以及实现自定义的公用方法,各个模块之间互不影响。如果各模块之间的公用方法比较多,也可以再去继承一个公用的类。

2、公用方法放在library中,调用CI实例不方便。

3、如果不喜欢$this->herlper的调用方法,可以让控制器去继承不同的公用控制器,思路是一样的,只是可能需要手动引入文件。

希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。

PHP 相关文章推荐
ThinkPHP自动验证失败的解决方法
Jun 09 PHP
php变量范围介绍
Oct 15 PHP
PHP文章按日期(月日)SQL归档语句
Nov 29 PHP
对于PHP 5.4 你必须要知道的
Aug 07 PHP
学习php分页代码实例
Oct 24 PHP
百度实时推送api接口应用示例
Oct 21 PHP
10个简化PHP开发的工具
Dec 25 PHP
php查询mysql数据库并将结果保存到数组的方法
Mar 18 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
Mar 18 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
Sep 16 PHP
PHP工厂模式简单实现方法示例
May 23 PHP
ThinkPhP+Apache+PHPstorm整合框架流程图解
Nov 23 PHP
CodeIgniter钩子用法实例详解
Jan 20 #PHP
CodeIgniter配置之database.php用法实例分析
Jan 20 #PHP
CodeIgniter多语言实现方法详解
Jan 20 #PHP
CI(CodeIgniter)模型用法实例分析
Jan 20 #PHP
教你php如何实现验证码
Jan 20 #PHP
CodeIgniter辅助之第三方类库third_party用法分析
Jan 20 #PHP
CodeIgniter扩展核心类实例详解
Jan 20 #PHP
You might like
php UTF-8、Unicode和BOM问题
2010/05/18 PHP
php 阴历-农历-转换类代码
2012/01/16 PHP
php函数array_merge用法一例(合并同类数组)
2013/02/03 PHP
PHP 读取大文件的X行到Y行内容的实现代码
2013/06/24 PHP
PHP中使用curl伪造IP的简单方法
2015/08/07 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
JavaScript针对网页节点的增删改查用法实例
2015/02/02 Javascript
基于jQuery实现带动画效果超炫酷的弹出对话框(附源码下载)
2016/02/22 Javascript
JS获取元素多层嵌套思路详解
2016/05/16 Javascript
Vuejs 组件——props数据传递的实例代码
2017/03/07 Javascript
JavaScript之RegExp_动力节点Java学院整理
2017/06/29 Javascript
JSON创建键值对(key是中文或者数字)方式详解
2017/08/24 Javascript
vue自定义移动端touch事件之点击、滑动、长按事件
2018/07/10 Javascript
element-ui循环显示radio控件信息的方法
2018/08/24 Javascript
详解如何模拟实现node中的Events模块(通俗易懂版)
2019/04/15 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
2019/10/10 jQuery
Js逆向实现滑动验证码图片还原的示例代码
2020/03/10 Javascript
在vue中使用回调函数,this调用无效的解决
2020/08/11 Javascript
[05:31]DOTA2英雄梦之声_第04期_光之守卫
2014/06/23 DOTA
python使用mysql数据库示例代码
2017/05/21 Python
python集合能干吗
2020/07/19 Python
H5页面适配iPhoneX(就是那么简单)
2019/12/02 HTML / CSS
世界排名第一的万圣节服装店:Spirit Halloween
2018/10/16 全球购物
马来西亚最热门的在线时尚商店:FashionValet
2018/11/11 全球购物
NFL加拿大官方网上商店:NHLShop.ca
2019/03/12 全球购物
英国屋顶用品和材料超市:Roofing Supplies UK
2019/08/24 全球购物
精选奢华:THE LIST
2019/09/05 全球购物
Contém1g官网:巴西彩妆品牌
2020/01/17 全球购物
工作会议欢迎词
2014/01/16 职场文书
护士见习期自我鉴定
2014/02/08 职场文书
校园文化标语
2014/06/18 职场文书
农林经济管理专业自荐信
2014/09/01 职场文书
员工担保书范本
2015/09/22 职场文书
Spring Data JPA使用JPQL与原生SQL进行查询的操作
2021/06/15 Java/Android
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android