亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

參考視頻中的路由類,自己動手寫一個,實現(xiàn)URL到類方法的映射

Original 2019-04-27 19:55:32 302
abstract:<?php /**  * 路由解析類  * 1.路由解析  * 2.請求分發(fā)  */ namespace pig; class Route {     //路由配置信息     protected $route
<?php
/**
 * 路由解析類
 * 1.路由解析
 * 2.請求分發(fā)
 */

namespace pig;

class Route
{
    //路由配置信息
    protected $route = [];

    //PATHINFO
    protected $pathInfo = [];

    //URL參數(shù)
    protected $params = [];

    public function __construct($route)
    {
        //路由配置初始化
        $this->route = $route;
    }

    //解析路由
    public function parse($queryStr = '')
    {
        // /admin/user/add/name/peter/age/30
        // $this->pathInfo = ['module'='admin','controller'='user','action'=>'add'}
        // 參數(shù)數(shù)組:$this->params = ['name'=>'peter','age'=>30]

        // 第一步:將查詢字符串前后的/去掉,再按分隔符/拆分到數(shù)組中
        $queryStr = trim(strtolower($queryStr),'/');
        $queryArr = explode('/',$queryStr);
        $queryArr = array_filter($queryArr);

        // 第二步:解析出queryArr數(shù)組中的內(nèi)容(模塊,控制器,操作,參數(shù))
        switch (count($queryArr)){
                  //沒有參數(shù),則使用默認(rèn)的模塊/控制器/操作
            case 0:
                $this->pathInfo = $this->route;
                break;

                  //只有一個參數(shù):用戶只提供了模塊,控制器和操作使用默認(rèn)值
            case 1:
                $this->pathInfo['module'] = $queryArr[0];
                break;

                  //二個參數(shù):模塊和控制器自定義,操作是默認(rèn)的
            case 2:
                $this->pathInfo['module'] = $queryArr[0];
                $this->pathInfo['controller'] = $queryArr[1];
                break;

                 //三個參數(shù):模塊/控制器/操作全部自定義:全部來自用戶的實際請求
            case 3:
                $this->pathInfo['module'] = $queryArr[0];
                $this->pathInfo['controller'] = $queryArr[1];
                $this->pathInfo['action'] = $queryArr[2];
                break;

                //對參數(shù)進(jìn)行處理
            default:
                $this->pathInfo['module'] = $queryArr[0];
                $this->pathInfo['controller'] = $queryArr[1];
                $this->pathInfo['action'] = $queryArr[2];

                //從pathInfo數(shù)組的索引3開始,將剩余的元素全部做為參數(shù)進(jìn)行處理
                $arr = array_slice($queryArr,'3');

                //鍵值對必須是成對出現(xiàn),所以每次遞增為2
            for($i = 0;$i < count($arr);$i += 2){
                //如果沒有第二個參數(shù),則放棄
                if(isset($arr[$i+1])){
                    $this->params[$arr[$i]] =$arr[$i+1];
                }
            }
            break;
        }

        //返回當(dāng)前路由的實例對象,主要是方便鏈?zhǔn)秸{(diào)用:$route->parse()->worm()->print()
        return $this;
    }

    //請求分發(fā)
    public function dispatch()
    {
        //生成帶有命名空間的控制器類名稱:app\模塊\controller\控制器類
        //類名稱應(yīng)該與類文件所在的絕對路徑一一對應(yīng),這樣才可以實現(xiàn)自動映射,方便自動加載
        //模塊名稱
        $module = $this->pathInfo['module'];

        //控制器名稱
        $controller = 'app\\'.$module.'\controller\\'. ucfirst($this->pathInfo['controller']);

        //操作名
        $action = $this->pathInfo['action'];

        if (!method_exists($controller,$action)){
            $action = $this->route['action'];
            header('Location:/');
        }
        // 將用戶的請求分發(fā)到指定的控制器和對應(yīng)的操作方法上
        return call_user_func_array([new $controller,$action],$this->params);
    }

QQ圖片20190427194550.png

路由類主要實現(xiàn)2個功能,路由解析和請求分發(fā)

路由解析首先要從url地址中獲取$queryStr = $_SERVER['QUERY_STRING'],再將$queryStr解析成2個部分,模塊、控制器、操作為一組,參數(shù)為另一組。請求分發(fā)就是將模塊、控制器重新組合成新的路徑,和操作、參數(shù)一起使用call_user_func_array([new $controller,$action],$this->params)系統(tǒng)自定義函數(shù)調(diào)用事先寫好的操作中自定義的函數(shù)方法。


Correcting teacher:天蓬老師Correction time:2019-04-28 08:48:41
Teacher's summary:如果能理解了這個路由原理, 那么所有框架的底層也不難理解了, 原理都是一樣的, 只是實現(xiàn)的機制和復(fù)雜程序不同罷了

Release Notes

Popular Entries