欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

php處理restful請求的路由類分享

 更新時(shí)間:2014年02月27日 09:11:56   作者:  
利用路由表與restful url進(jìn)行匹配,分發(fā)到不同的action處理,最基本的實(shí)現(xiàn),只考慮路由分發(fā)功能

復(fù)制代碼 代碼如下:

<?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;
        }
    }
?>

相關(guān)文章

  • Linux+Nginx+MySQL下配置論壇程序Discuz的基本教程

    Linux+Nginx+MySQL下配置論壇程序Discuz的基本教程

    這篇文章主要介紹了Linux+Nginx+MySQL下配置論壇程序Discuz的基本教程,Discuz是用PHP寫成的國內(nèi)最流行的論壇軟件,文中默認(rèn)前提是已經(jīng)構(gòu)建好了PHP環(huán)境,需要的朋友可以參考下
    2015-12-12
  • PHP中的表達(dá)式簡述

    PHP中的表達(dá)式簡述

    表達(dá)式是 PHP 最重要的基石。在 PHP 中,幾乎所寫的任何東西都是一個表達(dá)式。簡單但卻最精確的定義一個表達(dá)式的方式就是“任何有值的東西”。這篇文章主要介紹了PHP中的表達(dá)式簡述的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • thinkPHP商城公告功能開發(fā)問題分析

    thinkPHP商城公告功能開發(fā)問題分析

    這篇文章主要介紹了thinkPHP商城公告功能開發(fā)問題,結(jié)合實(shí)例形式分析了基于thinkPHP實(shí)現(xiàn)商城公告功能所涉及的ajax交互及數(shù)據(jù)庫操作相關(guān)技巧,需要的朋友可以參考下
    2016-12-12
  • Yii2學(xué)習(xí)筆記之漢化yii設(shè)置表單的描述(屬性標(biāo)簽attributeLabels)

    Yii2學(xué)習(xí)筆記之漢化yii設(shè)置表單的描述(屬性標(biāo)簽attributeLabels)

    這篇文章主要介紹了Yii2學(xué)習(xí)筆記之漢化yii設(shè)置表單的描述(屬性標(biāo)簽attributeLabels),非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-02-02
  • Yii實(shí)現(xiàn)Command任務(wù)處理的方法詳解

    Yii實(shí)現(xiàn)Command任務(wù)處理的方法詳解

    這篇文章主要介紹了Yii實(shí)現(xiàn)Command任務(wù)處理的方法,結(jié)合實(shí)例形式分析了Yii配置、加載及使用Command任務(wù)處理的步驟與相關(guān)技巧,需要的朋友可以參考下
    2016-07-07
  • Laravel認(rèn)證原理以及完全自定義認(rèn)證詳解

    Laravel認(rèn)證原理以及完全自定義認(rèn)證詳解

    最近在學(xué)習(xí)laravel框架,所以下面這篇文章主要給大家介紹了關(guān)于Laravel認(rèn)證原理以及完全自定義認(rèn)證的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • php獲取淘寶分類id示例

    php獲取淘寶分類id示例

    這篇文章主要介紹了使用php獲取淘寶分類id的方法,大家參考使用吧
    2014-01-01
  • laravel配置Redis多個庫的實(shí)現(xiàn)方法

    laravel配置Redis多個庫的實(shí)現(xiàn)方法

    這篇文章主要介紹了laravel配置Redis多個庫的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • PHP正在進(jìn)行時(shí)-變量詳解及字符串動態(tài)插入變量

    PHP正在進(jìn)行時(shí)-變量詳解及字符串動態(tài)插入變量

    這篇文章主要介紹了PHP正在進(jìn)行時(shí)-變量詳解及字符串動態(tài)插入變量的方法,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-12-12
  • PHP生成唯一ID之SnowFlake算法

    PHP生成唯一ID之SnowFlake算法

    snowflake算法是個啥?首先我來提出個問題,怎么在分布式系統(tǒng)中生成唯一性id并保持該id大致自增?在twitter中這是最重要的業(yè)務(wù)場景,于是twitter推出了一種snowflake算法。
    2016-12-12

最新評論