您当前的位置: 首页 > 网站编程 > PHP教程 > php处理restful请求的路由类分享

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

作者:不详 来源:网络 发布时间: 2014-08-05 21:32 点击:
利用路由表与restful url进行匹配,分发到不同的action处理,最基本的实现,只考虑路由分发功能 代码如下: ?php class Router { // 路由表 private $routers = array( array(name=userlist, pattern=get /user, action=User#get), array(name=userinfo, pattern=get /u

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

  利用路由表与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处理restful请求的路由类分享"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4