CodeIgniter自定义控制器MY_Controller用法分析
作者:老彭 发布时间:2024-05-05 09:17:36
本文实例讲述了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程序设计有所帮助。


猜你喜欢
- 比如我们有一张school表,里面有一个字段county_name,现在我们要查询county_name字段中包含a-w字母和数字以外字符的
- NetCDF(网络通用数据格式)文件后缀为.nc,文件中的数据结构包含维(dimensions)、变量(variables)和属性(attr
- <div id="outer" style="background:#099"> cli
- 今天在做一个老项目时,遇到一个需求,在javascript将url中的参数加密解密,从网上找发现了这段有用的代码:<SCRIPT LA
- 百度OCR体验地址:https://ai.baidu.com/tech/imagerecognition/general腾讯OCR体验地址:
- 因项目需要根据指定格式的文件生成XML标注文件,可以方便使用LabelImg打开进行编辑和查看。其原始文件默认使用逗号进行分隔,如下
- 经过总结,Python创建多线程主要有如下两种方法:函数类接下来,我们就来揭开多线程的神秘面纱。1. 用函数创建多线程在Python3中,P
- PHP mysqli_rollback() 函数关闭自动提交,做一些查询,提交查询,然后回滚当前事务:<?php// 假定数据库用户名
- JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机
- 前言我们经常需要根据用户对自己数据的一些操作来做一些事情.比如如果用户删除了自己的账号,我们就给他发短信骂他,去发短信求他回来.类似于这种功
- --相信大家肯定经常会把数据导入到数据库中,但是可能会有些记录行的所有列的数据是null,这为null的数据是我们不需要 --现在需要一个简
- F()函数F()函数的导入from django.db.models import F为什么要使用F()函数?一个 F()对象代表了一个mo
- python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”我遇到的问题:电脑上已经有
- 前言 获得图像的关键点后,可通过计算得到关键点的描述符。关键点描述符可用于图像的特征匹配。通常,在计算图A是否包含图B的特
- 有些时间没更新blog了,这两天为了更新<code collection>,于是重写了语法高亮的模块,这次是一个引擎,你可以根据
- 本文实例讲述了JavaScript简单计算人的年龄的方法。分享给大家供大家参考,具体如下:注意Date()类型转换,否则会出现NaN的错误b
- 一、类和对象通俗理解:类就是模板,对象就是通过模板创造出来的物体类(Class)由3个部分构成:类的名称: 类名类的属性: 一组数据类的方法
- lambda函数用法lambda非常重要的一个定义。lambda在【运行时】才绑定,【不是】在定义的时候绑定。下面这个列子:本意想:让X分别
- 本文实例讲述了javascript获取select值的方法。分享给大家供大家参考,具体如下:<!DOCTYPE html><
- 要求编写登录接口: 1. 输入用户名和密码2.认证成功后显示欢迎信息3.用户名输错,提示用户不存在,重新输入(5次错误,提示尝试次数过多,退