php處理restful請求的路由類分享
<?php
class Router {
// 路由表
private $routers = array(
array("name"=>"userlist", "pattern"=>"get /user", "action"=>"User#get"),
array("name"=>"userinfo", "pattern"=>"get /user/:s", "action"=>"User#getById"),
array("name"=>"useradd", "pattern"=>"post /user", "action"=>"User#add"),
array("name"=>"userupdate", "pattern"=>"update /user", "action"=>"User#update"),
array("name"=>"userdel", "pattern"=>"delete /user/:id", "action"=>"User#delete")
);
// 入口
public function dispatch() {
$url = $_SERVER["REQUEST_URI"];
$method = $_SERVER["REQUEST_METHOD"];
foreach ($this->routers as $router) {
$pattern = $router["pattern"];
$pats = explode(" ", $pattern);
if (strcasecmp($pats[0], $method) == 0) {
// 是否與當(dāng)前路由匹配
$params = $this->checkUrl($method, strtolower($url), strtolower($pats[1]));
if ($params != null) {
array_shift($params);
$action = $router["action"];
// 尋找到第一個匹配的路由即執(zhí)行,然后返回
return $this->invoke($action, $params);
}
}
}
echo "404 error";
// error 404
}
private function invoke($action, $params) {
$acts = explode("#", $action);
$className = $acts[0]."Action";
$methodName = $acts[1];
$actionDir = dirname(__FILE__).DIRECTORY_SEPARATOR."action";
// 載入action文件
$classFile = $actionDir.DIRECTORY_SEPARATOR.$className.".php";
if (! file_exists($classFile)) {
// 404 error
echo "404 error, no action found";
return;
} else {
require "$classFile";
// 使用反射執(zhí)行方法
$rc = new ReflectionClass($className);
if (! $rc->hasMethod($methodName)) {
// 404 error
echo "404 error, no method found";
return;
} else {
$instance = $rc->newInstance();
$method = $rc->getMethod($methodName);
$method->invokeArgs($instance, $params);
}
}
}
// 正則匹配檢查,并提取出參數(shù)
private function checkUrl($method, $str, $pattern) {
//echo "check $str with $pattern <br>";
$ma = array();
$pattern = ltrim(rtrim($pattern, "/"));
$pattern = "/".str_replace("/", "\/", $pattern)."\/?$/";
$pattern = str_replace(":s", "([^\/]+)", $pattern);
//echo "pattern $pattern<br>";
//$str = "/\".$str."$/";
if (preg_match($pattern, $str, $ma) > 0) {
return $ma;
}
return null;
}
}
?>
- PHP實(shí)現(xiàn)支持GET,POST,Multipart/form-data的HTTP請求類
- 通過JS和PHP兩種方法判斷用戶請求時(shí)使用的瀏覽器類型
- php自定義類fsocket模擬post或get請求的方法
- 解讀PHP的Yii框架中請求與響應(yīng)的處理流程
- YII2框架中使用yii.js實(shí)現(xiàn)的post請求
- yii2 在控制器中驗(yàn)證請求參數(shù)的使用方法
- Yii框架通過請求組件處理get,post請求的方法分析
- Yii 框架控制器創(chuàng)建使用及控制器響應(yīng)操作示例
- Yii框架響應(yīng)組件用法實(shí)例分析
- Yii2框架RESTful API 格式化響應(yīng),授權(quán)認(rèn)證和速率限制三部分詳解
- YII Framework學(xué)習(xí)之request與response用法(基于CHttpRequest響應(yīng))
- PHP封裝請求類實(shí)例分析【基于Yii框架】
相關(guān)文章
Linux+Nginx+MySQL下配置論壇程序Discuz的基本教程
這篇文章主要介紹了Linux+Nginx+MySQL下配置論壇程序Discuz的基本教程,Discuz是用PHP寫成的國內(nèi)最流行的論壇軟件,文中默認(rèn)前提是已經(jīng)構(gòu)建好了PHP環(huán)境,需要的朋友可以參考下2015-12-12Yii2學(xué)習(xí)筆記之漢化yii設(shè)置表單的描述(屬性標(biāo)簽attributeLabels)
這篇文章主要介紹了Yii2學(xué)習(xí)筆記之漢化yii設(shè)置表單的描述(屬性標(biāo)簽attributeLabels),非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02Yii實(shí)現(xiàn)Command任務(wù)處理的方法詳解
這篇文章主要介紹了Yii實(shí)現(xiàn)Command任務(wù)處理的方法,結(jié)合實(shí)例形式分析了Yii配置、加載及使用Command任務(wù)處理的步驟與相關(guān)技巧,需要的朋友可以參考下2016-07-07Laravel認(rèn)證原理以及完全自定義認(rèn)證詳解
最近在學(xué)習(xí)laravel框架,所以下面這篇文章主要給大家介紹了關(guān)于Laravel認(rèn)證原理以及完全自定義認(rèn)證的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07laravel配置Redis多個庫的實(shí)現(xiàn)方法
這篇文章主要介紹了laravel配置Redis多個庫的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04PHP正在進(jìn)行時(shí)-變量詳解及字符串動態(tài)插入變量
這篇文章主要介紹了PHP正在進(jìn)行時(shí)-變量詳解及字符串動態(tài)插入變量的方法,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下2017-12-12