AOP,MVC——Spring的学习以及对CodeIgniter的反思

AOP?原来咱们早就见过

最近在学习Spring,深深地感到这个框架之因此这么流行不是没有道理的,我以前一直用的是PHP,框架用的就是codeigniter,因为其简洁轻量的特性非常让人喜好,但是也有不少问题,然而不少问题Spring都是解决了的,好比
PHP项目中CodeIgniter使用的一些建议,这里提到的登陆逻辑的实现,就是具备Spring 面向切面编程 的雏形。因此刚看到Spring的面向切面编程(AOP),就以为:原来咱们早就见过。其本质上就是关注点的分离,能够清晰的分离不一样的业务逻辑,既提升了开发效率(不一样的逻辑由不一样的人并行书写),也利于代码维护(不用寻找遍及整个项目的log,或者验证代码)。php

在codeigniter中实现切面的方法:便可以如上文中所说的扩展CI 核心类的方法,也能够采用钩子(hook),详见: 钩子 - 扩展框架核心html

MVC?反哺Codeigniter

在使用Codeigniter经典的MVC模式进行开发的时候,享受到了许多便利,业务逻辑(C)、数据存储(M)、视图(C)分开,这样结构很清晰,思路也很天然。可是也赶上了一些问题,好比我在写后端的时候一般是面向两个前端的:一个是移动APP,一个是网站。这二者一般会有一些业务逻辑的重合,好比都会显示一些新闻列表(list),一般的作法是使用两套个模块,如图前端

clipboard.png

api是面向移动APP的,他的list方法就是web

$this->load->model ( 'api/Box_model','boxm' );
$data = $this->boxm->getRec ( $startCount, $perNumber );
echo_json ( $data );

web是面向网站的,他的list方法就是编程

$this->load->model ( 'web/Box_model','boxm' );
$data= $this->boxm->getRec ( $startCount, $perNumber );
$this->load->view ( 'web/list', $data );

这样的话就至关于控制器写了两次,模型也写了两次,并且好多CtrL+C,CtrL+V。其实出现了这么多CV代码,就该知道这样的架构是不太合理的,由于需求变化的时候改了一处,还得CV到另外一处去...... 而Spring的学习让我看到了解决这个问题的方法,就是要学会抽离逻辑,把真正的业务逻辑和视图逻辑分开,也就是把三层的MVC分红 View - Controller - Service - Repository 四层,其中Repository负责数据存储,Service负责真正的业务逻辑,Controller负责与用户界面有关的逻辑,View负责与用户交互。json

这样上面的代码就能够改成segmentfault

api后端

$this->load->service('list_service');
$data = $this->list_service->getRec ( $startCount, $perNumber );
echo_json ( $data );

web设计模式

$this->load->service('list_service');
$data = $this->list_service->getRec ( $startCount, $perNumber );
$this->load->view ( 'web/list', $data );

这样统一让Service去和业务逻辑打交道,Controller是须要用数据来和不一样的用户界面打交道(一个是返回json数据,一个是渲染HTML页面)。业务逻辑发上变化的时候只须要修改一个Service就能够了。api

那么怎么在Codeigniter中实现这个功能呢?这篇文章说的很清楚了,让CI框架支持service层
简单说来就是

  • 首先本身定义一个Service类,注意必定要加上 $this->CI =& get_instance();,这才能保证你能够在Service类中加载CI的各类资源,好比模型,辅助函数和库

  • 而后修改CI的加载器,使得 $this->load->service('list_service');这一句代码是可行的,这里的代码能够模仿CI 原生的加载器来写,好比在/system/core/Loader.php中的function helper()就是$this->load->helper('url');可行的原理

  • 最后就能够在Controller中调用不一样的Service,Service中调用不一样的model了。

后记

设计模式也是与时俱进的,在只有web一种终端的上个世纪,MVC模式是足够的,然而如今各类终端出现,MVC也会产生许多问题(固然这只是一个缘由),因而新的模式出现了,因此经典的要学,更新的也要看,经常思考项目中的问题,说不定本身也能搞一个设计模式出来(哈哈~)。

欢迎访问个人我的主页 mageek(mageek.cn)

相关文章
相关标签/搜索