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 相关文章推荐
php下封装较好的数字分页方法
Nov 23 PHP
php中批量替换文件名的实现代码
Jul 20 PHP
初步介绍PHP扩展开发经验分享
Sep 06 PHP
PHP获取指定函数定义在哪个文件中以及其所在的行号实例
May 08 PHP
php实现兼容2038年后Unix时间戳转换函数
Mar 18 PHP
php实现的用户查询类实例
Jun 18 PHP
PHP版QQ互联OAuth示例代码分享
Jul 05 PHP
Zend Framework实现Zend_View集成Smarty模板系统的方法
Mar 05 PHP
PHP树-不需要递归的实现方法
Jun 21 PHP
PHP合并数组函数array_merge用法分析
Feb 17 PHP
php curl简单采集图片生成base64编码(并附curl函数参数说明)
Feb 15 PHP
基于PHP的微信公众号的开发流程详解
Aug 07 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实现登陆验证码(类似条行码状)
2006/10/09 PHP
php学习 字符串课件
2008/06/15 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
Laravel中validation验证 返回中文提示 全局设置的方法
2019/09/29 PHP
laravel 获取当前url的别名方法
2019/10/11 PHP
js 字符串转化成数字的代码
2011/06/29 Javascript
面向对象的Javascript之一(初识Javascript)
2012/01/20 Javascript
使用pjax实现无刷新更改页面url
2015/02/05 Javascript
js实现下拉列表选中某个值的方法(3种方法)
2015/12/17 Javascript
jquery checkbox无法用attr()二次勾选问题的解决方法
2016/07/22 Javascript
JS实现瀑布流布局
2017/10/21 Javascript
修改UA在PC中访问只能在微信中打开的链接方法
2017/11/27 Javascript
详解vue-router 命名路由和命名视图
2018/06/01 Javascript
深入探索VueJS Scoped CSS 实现原理
2019/09/23 Javascript
原生js实现弹幕效果
2020/11/29 Javascript
python进程管理工具supervisor使用实例
2014/09/17 Python
Python3中常用的处理时间和实现定时任务的方法的介绍
2015/04/07 Python
Kali Linux安装ipython2 和 ipython3的方法
2019/07/11 Python
python爬虫 execjs安装配置及使用
2019/07/30 Python
python使用HTMLTestRunner导出饼图分析报告的方法
2019/12/30 Python
Python3压缩和解压缩实现代码
2021/03/01 Python
Html5原创俄罗斯方块(基于canvas)
2019/01/07 HTML / CSS
Timex手表官网:美国运动休闲手表品牌
2017/01/28 全球购物
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
西班牙香水和化妆品购物网站:Arenal Perfumerías
2019/03/01 全球购物
Unineed中文官网:高端护肤美妆与时尚配饰,英国直邮
2020/07/23 全球购物
数据库的约束含义
2012/09/09 面试题
如何将无状态会话Bean发布为WEB服务,只有无状态会话Bean可以发布为WEB服务?
2015/12/03 面试题
卖车协议书范本4篇
2014/10/01 职场文书
2014年统战工作总结
2014/12/09 职场文书
小兵张嘎电影观后感
2015/06/03 职场文书
天河观后感
2015/06/11 职场文书
2015年第31个教师节致辞
2015/07/31 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
2021/04/05 MySQL
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server