[李景山php]每天TP5-20170205|thinkphp5-Route.php-1

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <[email protected]>
// +----------------------------------------------------------------------

namespace think;
// 路由器 我來了
use think\App;
use think\Config;
use think\exception\HttpException;
use think\Hook;
use think\Loader;
use think\Log;
use think\Request;
use think\Response;
// 召喚各種工具
class Route
{
    // 路由規則
    private static $rules = [// 初始化 各種 規則
        'GET'     => [],
        'POST'    => [],
        'PUT'     => [],
        'DELETE'  => [],
        'PATCH'   => [],
        'HEAD'    => [],
        'OPTIONS' => [],
        '*'       => [],
        'alias'   => [],
        'domain'  => [],
        'pattern' => [],
        'name'    => [],
    ];

    // REST路由操作方法定義
    private static $rest = [// 重置 方法 REST 路由操作方法 定義
        'index'  => ['GET', '', 'index'],
        'create' => ['GET', '/create', 'create'],
        'edit'   => ['GET', '/:id/edit', 'edit'],
        'read'   => ['GET', '/:id', 'read'],
        'save'   => ['POST', '', 'save'],
        'update' => ['PUT', '/:id', 'update'],
        'delete' => ['DELETE', '/:id', 'delete'],
    ];

    // 不同請求類型的方法前綴
    private static $methodPrefix = [// 不同請求類型的 方法前綴
        'GET'    => 'get',
        'POST'   => 'post',
        'PUT'    => 'put',
        'DELETE' => 'delete',
    ];

    // 子域名
    private static $subDomain = '';// 子域名
    // 域名綁定
    private static $bind = [];// 綁定域名
    // 當前分組信息
    private static $group = [];// 分組信息
    // 當前子域名綁定
    private static $domainBind;// 子域名綁定
    private static $domainRule;// 規則
    // 當前域名
    private static $domain;// 當前域名

    /**
     * 註冊變量規則
     * @access public
     * @param string|array  $name 變量名
     * @param string        $rule 變量規則
     * @return void
     */
    public static function pattern($name = null, $rule = '')
    {// 註冊變量規則
        if (is_array($name)) {// 如果是數組 合併註冊
            self::$rules['pattern'] = array_merge(self::$rules['pattern'], $name);
        } else {// 單獨 註冊
            self::$rules['pattern'][$name] = $rule;
        }// 設置 變量規則
    }

    /**
     * 註冊子域名部署規則
     * @access public
     * @param string|array  $domain 子域名
     * @param mixed         $rule 路由規則
     * @param array         $option 路由參數
     * @param array         $pattern 變量規則
     * @return void
     */
    public static function domain($domain, $rule = '', $option = [], $pattern = [])
    {// 註冊子域名 部署規則  子域名 路由規則 路由參數 變量規則
        if (is_array($domain)) {// 如果是數組  其它沒有了
            foreach ($domain as $key => $item) {// 遍歷執行自己
                self::domain($key, $item, $option, $pattern);
            }
        } elseif ($rule instanceof \Closure) {// 如果規則 是個閉包
            // 執行閉包
            self::setDomain($domain);// 設置域名
            call_user_func_array($rule, []);// 執行閉包 不加參數
            self::setDomain(null);// 再次設置域名 但是 爲空
        } elseif (is_array($rule)) {// 如果是數組
            self::setDomain($domain);// 設置了 域名
            self::group('', function () use ($rule) {// 設置閉包 多執行 函數
                // 動態註冊域名的路由規則
                self::registerRules($rule);
            }, $option, $pattern);
            self::setDomain(null);// 設置域名 爲空
        } else {// 通用的規則設置
            self::$rules['domain'][$domain]['[bind]'] = [$rule, $option, $pattern];
        }
    }

    private static function setDomain($domain)// 設置 或者 清空 當前域名
    {
        self::$domain = $domain;
    }

    /**
     * 設置路由綁定
     * @access public
     * @param mixed     $bind 綁定信息
     * @param string    $type 綁定類型 默認爲module 支持 namespace class
     * @return mixed
     */
    public static function bind($bind, $type = 'module')// 設置路由綁定
    {
        self::$bind = ['type' => $type, $type => $bind];// 設置 當前 綁定 默認的是 模塊
    }

    /**
     * 設置或者獲取路由標識
     * @access public
     * @param string|array     $name 路由命名標識 數組表示批量設置
     * @param array            $value 路由地址及變量信息
     * @return array
     */
    public static function name($name = '', $value = null)
    {// 設置 或者 獲取路由 標識
        if (is_array($name)) {// 如果是 數組 直接設置 完成
            return self::$rules['name'] = $name;
        } elseif ('' === $name) {// 如果是字符串
            return self::$rules['name'];// 返回當前
        } elseif (!is_null($value)) { // 如果不爲空
            self::$rules['name'][$name][] = $value;// 當前的 爲空
        } else {// 設置 規則
            return isset(self::$rules['name'][$name]) ? self::$rules['name'][$name] : null;
        }
    }

    /**
     * 讀取路由綁定
     * @access public
     * @param string    $type 綁定類型
     * @return mixed
     */
    public static function getBind($type)
    {// 讀取路由綁定
        return isset(self::$bind[$type]) ? self::$bind[$type] : null;// 如果設置了 返回,否則 爲空
    }

    /**
     * 導入配置文件的路由規則
     * @access public
     * @param array     $rule 路由規則
     * @param string    $type 請求類型
     * @return void
     */
    public static function import(array $rule, $type = '*')
    {// 導入配置文件的路由規則
        // 檢查域名部署
        if (isset($rule['__domain__'])) {// 如果 設置 域名裏面的規則
            self::domain($rule['__domain__']);// 當前 域名 規則
            unset($rule['__domain__']);// 刪除 已經導入的規則
        }

        // 檢查變量規則
        if (isset($rule['__pattern__'])) {// 檢查變量規則
            self::pattern($rule['__pattern__']);//導入規則
            unset($rule['__pattern__']);// 清空
        }

        // 檢查路由別名
        if (isset($rule['__alias__'])) {
            self::alias($rule['__alias__']);
            unset($rule['__alias__']);
        }// 同上

        // 檢查資源路由
        if (isset($rule['__rest__'])) {
            self::resource($rule['__rest__']);
            unset($rule['__rest__']);
        }// 同上

        self::registerRules($rule, strtoupper($type));// 註冊 新 規則
    }

    // 批量註冊路由
    protected static function registerRules($rules, $type = '*')
    {// 批量註冊路由
        foreach ($rules as $key => $val) {// 批量 意味着 就是 遍歷
            if (is_numeric($key)) {// 當 爲數字
                $key = array_shift($val);// 拋出
            }
            if (empty($val)) {// 如果 爲空,值,跳出當前循環,然後繼續
                continue;
            }
            if (is_string($key) && 0 === strpos($key, '[')) {// 如果是 字符串 並 以 '['開頭
                $key = substr($key, 1, -1);// 如果 截取 最後的
                self::group($key, $val);// 當前 分組 $key 跟 $val 區別
            } elseif (is_array($val)) {// 如果是 數組
                self::setRule($key, $val[0], $type, $val[1], isset($val[2]) ? $val[2] : []);
            } else {// 設置 Rule
                self::setRule($key, $val, $type);
            }
        }
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章