還是熟悉的口號(hào):PHP 是世界上最好的語言
為什么會(huì)接觸PHP
接觸PHP完全是因?yàn)?Web 開發(fā)前标。由 PHP 天然與 HTML般妙、JavaScript 有親近感遵湖,也就是原生味兒十足。即使是PHP與HTML代碼混雜汤徽,從某種角度而言打肝,也能幫助初學(xué)者直觀地了解 Web 技術(shù)機(jī)理脂新。
從單頁 PHP 頁面到 MVC ,再到 改造原有 MVC 架構(gòu) 到服務(wù)于前端 React 的 API 設(shè)計(jì)粗梭。那段在學(xué)校養(yǎng)閑食堂三樓創(chuàng)業(yè)園區(qū)的時(shí)光中争便,我寫過 PHP 代碼甚至比前端代碼還要多。楼吃。始花。
基于MVC框架的改造之路
獲取接觸過 PHP MVC 開發(fā)的同學(xué)都了解過 Codeignitor 妄讯。與大部分的 MVC 模式一樣,model
負(fù)責(zé)獲取數(shù)據(jù)庫元數(shù)據(jù)酷宵,controller
負(fù)責(zé)業(yè)務(wù)邏輯處理亥贸,view
負(fù)責(zé)前端頁面的渲染,具體流程如下:
但隨著 AJAX 技術(shù)的流行浇垦,MVC 模式也進(jìn)行了一絲絲改進(jìn):
但在實(shí)際項(xiàng)目中炕置,由于我們前端使用了 React ,相比較于傳統(tǒng)的前端男韧,我們已經(jīng)將原來 view
層所需要處理的邏輯/用戶操作完全交給了前端:
這樣一來 MVC 我們只用到了 M 和 C朴摊,所以隨著項(xiàng)目的不斷迭代,controller
會(huì)變得越來越不堪重負(fù)此虑。
面向視圖 => 面向API
基本開發(fā)流程為:
-
model
層與數(shù)據(jù)庫交互甚纲,獲取元數(shù)據(jù)。 -
controller
層接受前端傳遞的參數(shù)朦前,進(jìn)行業(yè)務(wù)處理介杆,并返回前端想要的JSON
格式。
當(dāng)業(yè)務(wù)邏輯變得復(fù)雜韭寸,需求頻繁更改的時(shí)候容易出現(xiàn)以下弊端:
-
JSON
格式不規(guī)范春哨。 -
model
層和controller
層的業(yè)務(wù)紊亂。 - 新API需求提出之后可能會(huì)影響老API的正常使用恩伺,主要原因有:1赴背、
model
函數(shù)被更改;2晶渠、API名沖突凰荚;3、API 參數(shù)名更改等等乱陡。 - 前后端溝通成本太大浇揩。
- 代碼復(fù)用性低。
修改CI的結(jié)構(gòu)并制定開發(fā)規(guī)范
- 首先在
model
層之上添加了一層憨颠,這里我們稱之為logic
層,由于之前業(yè)務(wù)邏輯游離在model
和controller
之間积锅,沒有明確的一個(gè)規(guī)范爽彤,隨著需求的變更和開發(fā)的迭代,兩層處理的結(jié)構(gòu)已經(jīng)不能滿足開發(fā)的需求缚陷,我們需要一層專門處理邏輯适篙,將業(yè)務(wù)從model
和controller
中剝離出來。 - 在開發(fā)過程中我們發(fā)現(xiàn)箫爷,
model
層對(duì)數(shù)據(jù)庫的操作(這里說的操作是除去業(yè)務(wù)的)嚷节,都有共性聂儒,即都是通用的增刪查改。我們把這些數(shù)據(jù)操作稱為:CRUD
硫痰,它包括:Creact 衩婚、Read 、Update 效斑、Delete非春。 以 User_model 為例:
class User_model extends CI_Model {
private $table = 'user';
private function __construct() {
$this->load->database();
}
public function add_user($data = array()) {}
public function get_user($u_id, $column = '*') {}
public function get_user_page($where = array(), $column = '*', $offset = 0, $limit = 100) {}
public function update_user($u_id, $data = array()) {}
public function delete_user($u_id) {}
public function is_user($where = array()) {}
}
- 在
logic
層中我們編寫業(yè)務(wù)代碼,如:把從model
中獲取來的元數(shù)據(jù)進(jìn)行處理缓屠,組裝成前端想要的數(shù)據(jù)格式奇昙。 - 在
controller
中我們首先對(duì)所有的請(qǐng)求進(jìn)行日志記錄,身份校驗(yàn)敌完,參數(shù)校驗(yàn)之后直接把過濾后的數(shù)據(jù)丟給logic
储耐。這樣子一來controller
只是充當(dāng)了 路由 + 過濾器 的作用,如果之后修改 API 滨溉,前端的請(qǐng)求地址不需要修改弧岳,只要在logic
中修改或者重新一個(gè)方法就行了。 - 為了減少前后端溝通的成本业踏,我們可以在
controller
中再做點(diǎn)文章禽炬,比如說前端在測(cè)試 API 的時(shí)候傳過來一個(gè)事先約定好的key
然后controller
直接return
一個(gè)構(gòu)造好的數(shù)據(jù)格式,方便前端進(jìn)行參數(shù)的構(gòu)造勤家。