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)

相關文章
相關標籤/搜索