七天自製PHP框架 第一天 路由與控制器

2022-07-04 09:57:13 字數 2738 閱讀 3077

1.uri的改進

剛剛開始學php時,我們一定寫過blog.php?id=1之類的uri,使用get方式獲取引數。這樣的uri有兩個缺點,一是容易被sql注射攻擊,二是維護性可讀性差,大家可以比較下面兩種uri哪一種更具備可讀性。

www.mysite.com/blog.php?id=1
上面uri是我們初學php最常用的。

www.mysite.com/blog/1
這種uri是目前最流行的uri,舉個例子,比如很多讀書類,電影類**,都使用了這樣的uri,這樣的uri要比index.php?a=1&b=2&c=3&d=4....要簡潔很多。

2.實現方法

在web專案的根目錄下寫乙個.htaccess檔案

rewriteengine on

rewriterule ^([a-za-z0-9/]*)$ index.php/$1

重寫規則,讓網域名稱後面的字串直接做為乙個引數傳入index.php,這樣index.php就成為了你整個web應用的中心,定義了「請求和響應的對映」。

1.路由陣列

乙個php初學者,剛開始做專案,專案做著做著規模做大了,常常這個php頁面給另乙個php頁面用get方法傳值,有時傳的值還不止乙個,時間一久,你的web專案,n個php頁面宛如乙個複雜的蜘蛛網,讓你難以維護。一旦有修改,會涉及很多php檔案,工作量很大。

mvc的單一入口機制可以解決維護難的問題,路由就是一套對映,可以讓你乙個uri對應乙個方法。

$route=[

''=>'indexcontroller@index',

'blog'=>'blogcontroller@show',

'blog//'=>'blogcontroller@show',

];

2.獲取引數

$path=$_server['path_info'];

$path=ltrim($path,'/');

echo $path.php_eol;

我們在瀏覽器裡輸入:www.mysite.com/blog/1後,path變數為/blog/1。使用ltrim函式刪除左邊的斜槓,然後使用explode把字串拆解成陣列。

$path_arr=explode('/', $path);
核心**如下:

if(isset($_server['path_info']))

if(isset($path_arr[0]))

else

if(isset($path_arr[1]))

if(isset($route[$key]))

else

}else

unset函式可以銷毀陣列中key和value,但是並不會重建索引,所以path_arr[0]是要呼叫的控制器類和方法名,path_arr[1]或者path_arr[1..n]就作為傳入方法的引數。

重定向和錯誤頁面是web系統中最常見的,如果不用路由機制,你可能要沒完沒了的重複寫重定向或者錯誤頁面的顯示或者跳轉**,有了路由,只需要一句話就可以完成。

mvc採用了控制器(controller)來響應請求(request),每次請求來時,應該在指定的乙個php檔案中初始化這個控制器,而不是分別在不同的php檔案中做初始化工作,這樣可以減少資源的消耗。

我們現在路由陣列裡新增一項,value不是乙個字串,而是乙個匿名函式(closure)

$route=[

''=>'index',

'blog'=>'blogcontroller@show',

'blog//'=>'blogcontroller@show',

'f'=>function()

];

if(isset($route[$key]))

else

else }}

else

每一次都require乙個html頁面是一件很不優雅的事情,所以我們寫乙個render函式

function render($path,array $args)

<?php 

class controller

}class indexcontroller extends controller

render('template.html.php',['data'=>$data]); }}

class blogcontroller extends controller

render('template.html.php',['data'=>$data]); }}

?>

用不用控制器,取決於你的業務複雜度。個人建議使用控制器,但是對於業務很簡單的頁面跳轉或檢查,可以直接寫在乙個匿名函式裡。

我們也許寫過這樣的**:

class indexcontroller extends controller

}

這樣把介面的**嵌入的寫法是非常難以維護的,也是很多開發人員(包括我)最厭惡的寫法,因為這種寫法並沒有做好介面與業務邏輯的分離,所以我們需要使用檢視。

<?php foreach($data as $key=>$value) ?>

每一次呼叫控制器的某個方法時,render函式都會把引數以關聯陣列的形式傳入,做到「業務邏輯」和「表現」的淺層次分離,但是這種分離還不是最好的,因為前端開發人員仍然需要面對甚至處理php**,後端開發人員也有和前端人員溝通的成本,所以後面某一節,會再談一種更好的分離方式。

kaggle python七天入門 第一天

3.notebook快捷鍵 kaggle第一天學習內容主要有 python 語法 syntax 變數賦值 variable assignment number中的整數 int 與小數 float 算數運算子 arithmetic operator notebook 快捷鍵 python名字是源於英國...

ECS七天訓練營 第一天

1.設定安全組 這一步的目的是開放22和8080埠。22埠令ecs可以使用ssh連線,8080埠用於實現網頁瀏覽。配置如下 以下命令為驗證安裝包是否解壓成功,可以自由選擇使用。cd usr local lib nodejs node v13.9.0 linux x64 bin node v 接下來就...

30天自製作業系統(第一天)

30天自製作業系統 書中說閱讀本書不需要相關儲備知識,但實際上我認為該書還是需要很多儲備知識的。書的第零天主要是介紹開發前的準備,我認為是心理上的準備更多。好了,不說這麼多,到第1天。直接著手開發。第1天上來書上就叫使用乙個二進位制編輯器,直接用二進位制編寫乙個可以直接在啟動區執行的顯示hello ...