php处理restful请求的路由类分享

2015-01-24信息快讯网

利用路由表与restful url进行匹配,分发到不同的action处理,最基本的实现,只考虑路由分发功能

<?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"]; // 寻找到第一个匹配的路由即执行,然后返回 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"; // 使用反射执行方法 $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); } } }

// 正则匹配检查,并提取出参数 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中Fatal error session_start()错误解决步骤
Linux下创建nginx脚本-start、stop、reload…
PHP伪静态Rewrite设置之APACHE篇
PHP return语句的另一个作用
php mb_substr()函数截取中文字符串应用示例
PHP中的gzcompress、gzdeflate、gzencode函数详解
PHP错误Allowed memory size of 67108864 bytes exhausted的3种解决办法
浅析get与post的一些特殊情况
PHP ignore_user_abort函数详细介绍和使用实例
PHP开发框架kohana3 自定义路由设置示例
改写ThinkPHP的U方法使其路由下分页正常
让codeigniter与swfupload整合的最佳解决方案
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
PHP错误WARNING: SESSION_START() [FUNCTION.SESSION-START]解决方法
php url路由入门实例
php function用法如何递归及return和echo区别
PHP 函数call_user_func和call_user_func_array用法详解
PHP中session变量的销毁
php中session退出登陆问题
php中require和require_once的区别说明
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
PHP中redis的用法深入解析
PHP strip_tags()去除HTML、XML以及PHP的标签介绍
php中simplexml_load_string使用实例分享
php中的filesystem文件系统函数介绍及使用示例
php发送post请求的三种方法
更改localhost为其他名字的方法
采用header定义为文件然后readfile下载(隐藏下载地址)
preg_match_all使用心得分享
基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
wordpress自定义url参数实现路由功能的代码示例
PHP URL路由类实例
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
PHP swfupload图片上传的实例代码
实测在class的function中include的文件中非php的global全局环境
©2014-2024 dbsqp.com