CodeIgniter控制器之业务逻辑实例分析


Posted in PHP onJanuary 20, 2016

本文实例分析了CodeIgniter控制器之业务逻辑。分享给大家供大家参考,具体如下:

前面分析了公用控制器按模块分发,方便对特定模块的控制,而具体的实现类则是放在library中。那放在library中是否合适呢?以及控制器中更多的业务逻辑该放在哪里?

先说下对CI中几个文件夹的理解

helpers、libraries: 存放一系列辅助函数、辅助类,用来辅助控制器、业务逻辑实现功能。他们中的方法应当尽量避免与CI依赖,依赖越紧越难以复用。以邮件发送为例,发送邮件时很多参数是不变的,如编码、协议、端口等,我们可能会在config下进行配置这些参数,然后library封装一个邮件发送的类,并在其中获取CI实例后读取这些参数。此时就出现了与CI实例的依赖,该类就只能在CI框架中使用,其他系统要用到,就只能重写了,没达到复用的目的。如果发送的类只是接收参数,并封装发送方法呢?所以说,尽可能的让helpers、libraries变的简单,职责变得单一。

controllers: 控制器目录。控制器主要用来接管程序,起到连接的作用。通常情况下,我们会把业务逻辑写在action中。但随着业务变得复杂,action代码将越来越臃肿,难以维护。

models: 模型目录。CI的模型的主要职责就是和数据库打交道,获取数据。很多时候也会把业务逻辑放在模型中,但业务逻辑与模型实际上是两种东西了。模型只是获取数据,业务逻辑可能是把这些数据根据业务需要进行组合,组合方式可能有很多种,放在模型中会让模型难以维护且不利于复用。说个碰到的例子,对数据按一定条件做缓存,获取数据和缓存结果两个流程写在同一个方法中,但同样的数据需要做另一种形式的缓存时发现,获取数据的方法就没法重用了。

third_party:第三方类库目录。拿到一个类库后不要直接使用, 可以在library中进行一次封装,让其更适应于系统,其他人使用起来难度也会降低。

可以发现,每个文件夹都有自己的职责,每个模块都有自己的家,都有自己的职能。那业务逻辑该怎么办?

既然这样, 我们也应该给业务逻辑安个家,建立一个唯一的目录用来存放业务逻辑,暂且命名为service。控制器主要负责接收参数并调用service,service来调用模型,各层各尽其责。

下面看看怎么实现:

我们可以重写MY_Load,增加service方法,直接通过

$this->load->service('user_service');
来调用。
但业务逻辑很多都需要获取CI实例,这里可以参考模型的方法,core建立一个MY_Service,其他service均继承该类,这样子service里用法就跟控制器里一样了。
class MY_Service
{
  public function __construct()
  {
    log_message('debug', "Service Class Initialized");
  }
  function __get($key)
  {
    $CI = & get_instance();
    return $CI->$key;
  }
}

其实主要思路还是需要有一层用来处理业务逻辑,java中都有这一层。随着对CI的不断熟悉,发觉这里需要这一层,达到解放控制器和模型的目的。和这种类似的做法还有很多,如果系统中有很多地方需要用到web service 或者说cache之类的,其实也可以按照上面的思路单独放在一个文件夹中处理,方便管理。

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

PHP 相关文章推荐
PHP 高手之路(三)
Oct 09 PHP
PHP 5.0对象模型深度探索之类的静态成员
Mar 27 PHP
PHPMYADMIN 简明安装教程 推荐
Mar 07 PHP
php导出CSV抽象类实例
Sep 24 PHP
ThinkPHP中RBAC类的四种用法分析
Nov 24 PHP
php源码分析之DZX1.5随机数函数random用法
Jun 17 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
Oct 19 PHP
php快速排序原理与实现方法分析
May 26 PHP
php 7新特性之类型申明详解
Jun 06 PHP
windows下的WAMP环境搭建图文教程(推荐)
Jul 27 PHP
浅谈php的TS和NTS的区别
Mar 13 PHP
PHP中关于php.ini参数优化详解
Feb 28 PHP
CodeIgniter自定义控制器MY_Controller用法分析
Jan 20 #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
You might like
PHP配置文件中最常用四个ini函数
2007/03/19 PHP
php 从数据库提取二进制图片的处理代码
2009/09/09 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
2011/09/20 PHP
PHP闭包实例解析
2014/09/08 PHP
php实现网站顶踩功能的完整前端代码
2015/07/19 PHP
JavaScript OOP类与继承
2009/11/15 Javascript
JQuery1.4+ Ajax IE8 内存泄漏问题
2010/10/15 Javascript
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
使用PHP+JQuery+Ajax分页的实现
2013/04/23 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
2015/05/16 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
6种javascript显示当前系统时间代码
2015/12/01 Javascript
创建一个类Person的简单实例
2016/05/17 Javascript
总结javascript中的六种迭代器
2016/08/16 Javascript
浅谈vue-router 路由传参的方法
2017/12/27 Javascript
Node.js搭建WEB服务器的示例代码
2018/08/15 Javascript
在vue中配置不同的代理同时访问不同的后台操作
2020/09/11 Javascript
[02:51]DOTA2战队出征照拍摄花絮 TI3明星化身时尚男模
2013/07/22 DOTA
[28:07]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第二场 12.13
2020/12/17 DOTA
[54:17]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第二场 1月10日
2021/03/11 DOTA
使用pandas中的DataFrame数据绘制柱状图的方法
2018/04/10 Python
python处理document文档保留原样式
2019/09/23 Python
Python爬取爱奇艺电影信息代码实例
2019/11/26 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
2020/02/25 Python
Python模拟登录requests.Session应用详解
2020/11/17 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
解析HTML5中的新功能本地存储localStorage
2016/03/01 HTML / CSS
Raleigh兰令自行车美国官网:英国凤头牌自行车
2018/01/08 全球购物
php优化查询foreach代码实例讲解
2021/03/24 PHP
植树造林的宣传标语
2014/06/23 职场文书
六查六看六改心得体会
2014/10/14 职场文书
农村党支部承诺书
2015/04/30 职场文书
2016年校园社会综合治理宣传月活动总结
2016/03/16 职场文书
导游词之井冈山
2019/11/20 职场文书
Java9新特性之Module模块化编程示例演绎
2022/03/16 Java/Android
游戏《东方异文石:爱亚利亚黎明》正式版发布
2022/04/03 其他游戏