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中在PDO中使用事务(Transaction)
May 14 PHP
在php中判断一个请求是ajax请求还是普通请求的方法
Jun 28 PHP
PHP与javascript实现变量交互的示例代码
Jul 23 PHP
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
Nov 18 PHP
简单说说PHP优化那些事(经验分享)
Nov 27 PHP
Codeigniter框架实现获取分页数据和总条数的方法
Dec 05 PHP
php简单获取文件扩展名的方法
Mar 24 PHP
WordPress用户登录框密码的隐藏与部分显示技巧
Dec 31 PHP
PHP文件上传之多文件上传的实现思路
Jan 27 PHP
php计算给定日期所在周的开始日期和结束日期示例
Feb 06 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
May 08 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
Oct 12 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
模仿OSO的论坛(四)
2006/10/09 PHP
PHP常用特殊运算符号和函数总结(php新手入门必看)
2013/02/02 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
收藏Javascript中常用的55个经典技巧
2007/08/12 Javascript
IE的有条件注释判定IE版本详解(附实例代码)
2012/01/04 Javascript
THREE.JS入门教程(4)创建粒子系统
2013/01/24 Javascript
使用Grunt.js管理你项目的应用说明
2013/04/24 Javascript
JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)
2013/10/01 Javascript
JS图片切换的具体方法(带缩略图版)
2013/11/12 Javascript
jQuery取得select选择的文本与值的示例
2013/12/09 Javascript
input:checkbox多选框实现单选效果跟radio一样
2014/06/16 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
利用jQuery实现漂亮的圆形进度条倒计时插件
2015/09/30 Javascript
JS实现unicode和UTF-8之间的互相转换互转
2017/07/05 Javascript
10个在JavaScript开发中常遇到的BUG
2017/12/18 Javascript
javascript获取图片的top N主色值方法详解
2018/01/26 Javascript
vue vant Area组件使用详解
2019/12/09 Javascript
JS document对象简单用法完整示例
2020/01/14 Javascript
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
Python random模块(获取随机数)常用方法和使用例子
2014/05/13 Python
分析并输出Python代码依赖的库的实现代码
2015/08/09 Python
Python实现的简单模板引擎功能示例
2017/09/02 Python
python 随机数使用方法,推导以及字符串,双色球小程序实例
2017/09/12 Python
python版opencv摄像头人脸实时检测方法
2018/08/03 Python
Python实现查找数组中任意第k大的数字算法示例
2019/01/23 Python
python中的colorlog库使用详解
2019/07/05 Python
pytorch 实现删除tensor中的指定行列
2020/01/13 Python
Python turtle画图库&&画姓名实例
2020/01/19 Python
python3中datetime库,time库以及pandas中的时间函数区别与详解
2020/04/16 Python
Django celery异步任务实现代码示例
2020/11/26 Python
介绍一下Linux中的链接
2016/06/05 面试题
法学毕业生自我鉴定
2013/11/08 职场文书
汽车运用工程系毕业生自荐信
2013/12/27 职场文书
我为自己代言广告词
2014/03/18 职场文书
毕业生应聘求职信
2014/07/10 职场文书
合同权益转让协议书模板
2014/11/18 职场文书