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

理解自動(dòng)映射和自動(dòng)加載。請(qǐng)求分發(fā)處理

original 2019-06-11 01:43:51 303
abstrait:<?php /**  * Created by PhpStorm.  * User: Administrator  * Date: 2019/6/9  * Time: 2:18  */ namespace pig; use app\a
<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/6/9
 * Time: 2:18
 */
namespace pig;
use app\admin\controller\Index;

/**
 * Class router  路由解析類
 * @package pig
 * 1  路由解析    模塊/控制器/操作方法/參數(shù)
 * 2  請(qǐng)求分發(fā)   使用命名空間 自動(dòng)映射到具體的類中 ,然后將參數(shù)傳進(jìn)去處理  重點(diǎn)理解  call_user_func_array函數(shù)
 */
class router {
    // 路由信息
    public $route = [];
    //pathInfo  參數(shù)
    public  $pathInfo = [];

    // url 參 protected   繼承類  自己 同一個(gè)包的類 都可訪問(wèn)
    //protected $params = [];
    public $params = [];
    // 構(gòu)造方法
    public  function __construct($route){
        // 路由 配置初始化
        $this->route  = $route;
    }

    //  解析 路由
    public  function parse($queryStr = ''){
        // /admin/user/add/name/peter/age/30
        // ['module'=>'admin','controller'=>'user','action'=>'add']  模塊,  控制器 ,  操作方法
        //  參數(shù)  ['name'=>'peter','age'=>'30']

        //第一步 去除多余字符,切割數(shù)組,過(guò)濾數(shù)組 處理邏輯  ,  將前后的/  去掉
        $queryStr = trim($queryStr,'/');
        $queryArr = explode('/',$queryStr);
        // 過(guò)濾 數(shù)組  ,過(guò)濾掉空值
        $queryArr = array_filter($queryArr);

        //第二步  根據(jù)數(shù)組  解析出的 模塊 , 控制器 ,操作 , 參數(shù)
        $num = count($queryArr);
        switch($num) {
            //  沒(méi)有參數(shù) 則為默認(rèn)的
            case 0:
                // 則為配置信息的默認(rèn) 模塊, 控制器 ,操作
                $this->pathInfo = $this->route;
                break;
            // 1個(gè)參數(shù) 表示 模快
            case 1:
                $this->pathInfo['module'] = $queryArr[0];
                break;
            //  2 個(gè)參數(shù)  表示  模塊  , 控制器
            case 2:
                $this->pathInfo['module'] = $queryArr[0];
                $this->pathInfo['controller'] = $queryArr[1];
                break;
            //  3 個(gè)參數(shù)  表示  模塊  , 控制器 , 操作
            case 3:
                $this->pathInfo['module'] = $queryArr[0];
                $this->pathInfo['controller'] = $queryArr[1];
                $this->pathInfo['action'] = $queryArr[2];
                break;
            //  其他參數(shù)  表示 可 解析參數(shù)
            default :
                $this->pathInfo['module'] = $queryArr[0];
                $this->pathInfo['controller'] = $queryArr[1];
                $this->pathInfo['action'] = $queryArr[2];
                // 去除多余參數(shù)
                $num -= ($num - 3) % 2 == 0 ? 0 : 1;

                // 索引從3 開(kāi)始
                for ($i = 3; $i < $num; $i += 2) {
                    $this->params[$queryArr[$i]] = $queryArr[$i + 1];
                }
                break;
        }
    }

    // 請(qǐng)求分發(fā)
    public function dispatch(){
        // 生成帶有命名空間的控制器類稱: app\模塊\controller\控制器\action\操作方法
        //  類名稱應(yīng)該與類文件一一對(duì)應(yīng) , 這樣方便自動(dòng)映射,實(shí)現(xiàn)自動(dòng)加載   例: 模塊\admin\控制器controller\index  操作方法\add  為 index.php(控制器文件中的函數(shù))

        // 模塊名稱
        $module = $this->pathInfo['module'];

        // 控制器
        $controller = 'app\\'.$module.'\controller\\'.$this->pathInfo['controller'];

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

        // 檢查一個(gè)類的是否存在于該方法 ,如果沒(méi)有則 默認(rèn)的路由
        if(!method_exists($controller,$action) ){
            $action = $this->route['action'];
            // 設(shè)置表頭跳轉(zhuǎn)
            echo "沒(méi)有該方法,進(jìn)行表頭跳轉(zhuǎn)";
            //header('Location:/');
            return false;
        }
        //  使用  call_user_func_array  映射  到控制器中
        return call_user_func_array([new $controller,$action],$this->params);
    }

    // 返回參數(shù)
    public function getPrams(){
        return $this->params;
    }
}

// 測(cè)試路由
$queryStr = $_SERVER['QUERY_STRING'];
echo "<h2>".$queryStr."<hr></h2><pre>";

// 加載配置信息
$config =  require __DIR__."/config.php";

$rou = new router($config['route']);

$rou->parse($queryStr);

echo "打印??煨畔?quot;;
print_r($rou->pathInfo);
echo "打印參數(shù)信息";
print_r($rou->params);

// 加載模塊
require __DIR__."/../app/admin/controller/index.php";

echo "<h1>控制器名稱為:</h1>";
print_r($rou->dispatch());


Professeur correcteur:查無(wú)此人Temps de correction:2019-06-11 09:19:21
Résumé du professeur:完成的不錯(cuò)。理解一些理論知識(shí),會(huì)讓你代碼寫(xiě)的更好。繼續(xù)加油

Notes de version

Entrées populaires