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

路由解析類(lèi)小練習(xí)

??? 2019-04-06 19:12:11 218
????:<?php /**  * 路由解析類(lèi)  * 1.路由解析  * 2.請(qǐng)求分發(fā)  */ namespace pig; class Route {     //路由配置參數(shù)     protected $rout
<?php
/**
 * 路由解析類(lèi)
 * 1.路由解析
 * 2.請(qǐng)求分發(fā)
 */

namespace pig;


class Route
{
    //路由配置參數(shù)
    protected $route = [];

    //PATHINFO解析模塊
    protected $pathInfo = [];
//為了測(cè)試把私有屬性protected修改成public
//    public $pathInfo = [];

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

    //構(gòu)造方法
    public function __construct($route)
    {
        //用路由配置初始化
        $this->route = $route;
    }

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

        //第一步:將字符串前后的/去掉,再按分隔符/拆分到數(shù)組中
        // http://pig.io/pig/route.php?admin/user/add/name/zhu/age/30  結(jié)果: /admin/user/add/name/zhu/age/30
        //1.strtolower($queryStr)轉(zhuǎn)換成小寫(xiě),trim去掉前后/
        //$queryStr = trim(strtolower($queryStr),'/');
        $queryStr = trim(strtolower($queryStr),'/');
        //2.用explode('/',$queryStr)切割
        $queryArr= explode('/',$queryStr);
        //3.用array_filter()過(guò)濾空值,0會(huì)當(dāng)成false
        //$queryArr = array_filter($queryArr);

        //第二步:解析出$queryArr數(shù)組中的內(nèi)容(模塊,控制器,操作,參數(shù))
        switch(count($queryArr))
        {
            //沒(méi)有參數(shù),使用默認(rèn)的模塊/控制器/操作
            case 0:
                $this->pathInfo = $this->route;
                break;
                //只有一個(gè)參數(shù):只存在模塊,控制器和操作使用默認(rèn)值
            case 1:
                $this->pathInfo['module'] = $queryArr['0'];
                break;

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

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

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

                //從pathInfo數(shù)組的索引開(kāi)始,將剩余的元素全部作為參數(shù)來(lái)處理
                $arr = array_slice($queryArr,3);
                //從第4個(gè)元素進(jìn)行處理,鍵值對(duì)必須成對(duì)出現(xiàn),每次遞增2,每2個(gè)一組進(jìn)行處理
            for($i=0;$i < count($arr);$i += 2){
                //如果沒(méi)有第二個(gè)參數(shù),則放棄
                if(isset($arr[$i+1])){
                    //參數(shù)鍵值對(duì)處理
                    $this->params[$arr[$i]] = $arr[$i+1];
                }
            }
                break;
        }
        //返回當(dāng)前路由的實(shí)例對(duì)象,主要是方便鏈?zhǔn)秸{(diào)用:$route->parse()->worm()
        return $this;
    }
    //請(qǐng)求分發(fā)
    public function dispatch()
    {
        //生成的帶有命名空間的控制器類(lèi)名稱(chēng):app\模塊\controller\控制器類(lèi)
        //類(lèi)名稱(chēng)與類(lèi)文件所在的絕對(duì)路勁一一對(duì)應(yīng),實(shí)現(xiàn)自動(dòng)映射,方便加載
        //模塊名稱(chēng)
        $module = $this->pathInfo['module'];

        //控制器名稱(chēng)  獲取絕對(duì)路徑:'app\\' . $module .'\controller\\' .
        $controller = 'app\\' . $module .'\controller\\' . ucfirst($this->pathInfo['controller']);
       //die($controller);


        //操作名
        $action = $this->pathInfo['action'];
        //判斷$controller是否存在$action方法
        if(!method_exists($controller,$action)){
            $action = $this->route['action'];
            //不存在跳轉(zhuǎn)到首頁(yè)
            header('Location:/');
        }
        //存在執(zhí)行將用戶請(qǐng)求分發(fā)到指定的控制器和方法上
        return call_user_func_array([new $controller,$action],$this->params);
    }

    //獲取pathInfo信息
    public function  getPathInfo()
    {
        return $this->pathInfo;
    }

    //獲取模塊
    public  function  getModule()
    {
        return $this->pathInfo['module'] ? :$this->route['module'];
    }

    //獲取控制器名稱(chēng)
    public  function getController()
    {
        return 'app\\' . $this->getModule() .'\controller\\';
    }
}

//測(cè)試路由
$queryStr = $_SERVER['QUERY_STRING'];
echo $queryStr;
echo '<hr>';
echo '<pre>';
print_r(explode('/',$queryStr));
echo '<hr>';


$config = require 'config.php';
//實(shí)例化Route(),放在變量中
$route = new Route($config['route']);
$route->parse($queryStr);
//顯示模塊/控制器/方法
print_r($route->pathInfo);
//顯示參數(shù)
print_r($route->params);
//對(duì)象的形式調(diào)用
//print_r($route->parse());

//測(cè)試請(qǐng)求分發(fā)
require __DIR__ .'/../app/admin/controller/Index.php';
echo $route->dispatch();


?? ???:天蓬老師?? ??:2019-04-08 10:12:46
???? ??:你這是把教學(xué)代碼全部復(fù)制上來(lái), 真的懂了嗎

??? ??

?? ??