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) {
// 是否與當前路由匹配
$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實現(xiàn)支持GET,POST,Multipart/form-data的HTTP請求類
- 通過JS和PHP兩種方法判斷用戶請求時使用的瀏覽器類型
- php自定義類fsocket模擬post或get請求的方法
- 解讀PHP的Yii框架中請求與響應的處理流程
- YII2框架中使用yii.js實現(xiàn)的post請求
- yii2 在控制器中驗證請求參數(shù)的使用方法
- Yii框架通過請求組件處理get,post請求的方法分析
- Yii 框架控制器創(chuàng)建使用及控制器響應操作示例
- Yii框架響應組件用法實例分析
- Yii2框架RESTful API 格式化響應,授權(quán)認證和速率限制三部分詳解
- YII Framework學習之request與response用法(基于CHttpRequest響應)
- PHP封裝請求類實例分析【基于Yii框架】
相關(guān)文章
Linux+Nginx+MySQL下配置論壇程序Discuz的基本教程
這篇文章主要介紹了Linux+Nginx+MySQL下配置論壇程序Discuz的基本教程,Discuz是用PHP寫成的國內(nèi)最流行的論壇軟件,文中默認前提是已經(jīng)構(gòu)建好了PHP環(huán)境,需要的朋友可以參考下2015-12-12Yii2學習筆記之漢化yii設置表單的描述(屬性標簽attributeLabels)
這篇文章主要介紹了Yii2學習筆記之漢化yii設置表單的描述(屬性標簽attributeLabels),非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-02-02