<?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); } } }
[李景山php]每天TP5-20170205|thinkphp5-Route.php-1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.