소스 검색

update rules

朱金辉 1 년 전
부모
커밋
14e6358d8c
5개의 변경된 파일89개의 추가작업 그리고 63개의 파일을 삭제
  1. 16 7
      src/Base/Route.php
  2. 35 3
      src/Qii.php
  3. 10 42
      src/Request/Url/Base.php
  4. 23 8
      src/Request/Url/Short.php
  5. 5 3
      src/Router/Parse/Normal.php

+ 16 - 7
src/Base/Route.php

@@ -263,15 +263,24 @@ class Route
      */
     public function parse($uri, $route) {
         //去掉后缀名,不匹配后缀名
-        $ext = ".". pathinfo($uri, PATHINFO_EXTENSION);
-        if(substr($uri, -1 * strlen($ext)) == $ext) {
-            $uri = substr($uri, 0,-1 * strlen($ext));
+        $ext = pathinfo($uri, PATHINFO_EXTENSION);;
+        if($ext) {
+            $ext = ".". $ext;
+            if(substr($uri, -1 * strlen($ext)) == $ext) {
+                $uri = substr($uri, 0,-1 * strlen($ext));
+            }
         }
-        $routeExt = ".". pathinfo($route[0], PATHINFO_EXTENSION);
-        if(substr($route[0], -1 * strlen($routeExt)) == $routeExt) {
-            $route[0] = substr($route[0], 0,-1 * strlen($routeExt));
+        $routeExt = pathinfo($route[0], PATHINFO_EXTENSION);
+        if($routeExt) {
+            $routeExt = ".". pathinfo($route[0], PATHINFO_EXTENSION);
+            if(substr($route[0], -1 * strlen($routeExt)) == $routeExt) {
+                $route[0] = substr($route[0], 0,-1 * strlen($routeExt));
+            }
+        }
+        if(!preg_match("/\{.*?\}/i", $route[0]) && $uri == $route[0]) {
+            //没有参数的匹配完整就直接返回route和参数值null
+            return [$route, null];
         }
-
         //优先精确匹配
         if(preg_match("/\{.*?\}/i", $route[0])) {
             $uriArray = explode("/", $uri);

+ 35 - 3
src/Qii.php

@@ -30,7 +30,14 @@ if (IS_CLI) {
         && is_array($_SERVER['argv']) && count($_SERVER['argv']) > 0) {
         $args = $_SERVER['argv'];
     }
-    define('PATH_INFO', array_pop($args));
+    $cliAgs = QiiHandleCliArgs($args);
+    $_SERVER['__CLI_ARGS'] = $cliAgs;
+    $_SERVER['REQUEST_URI'] = $cliAgs[1] . ($cliAgs[3] ? '?'. $cliAgs[3] : '');
+    $_SERVER['QUERY_STRING'] = $cliAgs[3];
+    $_SERVER['SCRIPT_NAME'] = $cliAgs[0];
+    $_GET = $cliAgs[2];
+    $_POST = $cliAgs[2];
+    define('PATH_INFO', $cliAgs[1]);
 } else {
     define('PATH_INFO', isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '');
 }
@@ -54,14 +61,39 @@ Import::requires(
     )
 );
 
-
+function QiiHandleCliArgs($parameter) {
+    $fileName = array_shift($parameter);
+    $uri = array_shift($parameter);
+    if(substr($uri, 0, 1) != '/') {
+        $uri = "/". $uri;
+    }
+    //解析parameter
+    $params = array();
+    $query = [];
+    foreach ($parameter as $value) {
+        preg_match("/\{(?P<name>(.*?))(\=|\:)(?P<value>(.*).+)\}/", $value, $matches);
+        if($matches && isset($matches['name'])) {
+            $params[$matches['name']] = $matches['value'];
+            $query[] = $matches['name'] .'='. urlencode($matches['value']);
+        }else {
+            preg_match("/(?P<name>(.*?))(\=|\:)(?P<value>(.*).+)/", $value, $matches);
+            if($matches && isset($matches['name'])) {
+                $params[$matches['name']] = $matches['value'];
+                $query[] = $matches['name'] . '=' . urlencode($matches['value']);
+            }else{
+                $parameter[$value] = '';
+                $query[] = $value .'=';
+            }
+        }
+    }
+    return array($fileName, $uri, $params, join("&", $query));
+}
 class Qii extends Application
 {
     public function __construct()
     {
         parent::__construct();
     }
-
     /**
      * Instance func
      *

+ 10 - 42
src/Request/Url/Base.php

@@ -257,56 +257,24 @@ abstract class Base
      */
     public function CliParams($key = '')
     {
-        $argv = array();
-        if (isset($_SERVER['argv'])) $argv = $_SERVER['argv'];
-        //修正部分服务器Rewrite 后再加参数不识别的问题(直接进入命令行的模式)
-        if ($argv && $_SERVER['PHP_SELF'] == $_SERVER['SCRIPT_NAME']) {
-            if (count($argv) == 1) return;
-            array_shift($argv);
-            $path = $argv[0];
-            if($query = stristr($path, '?')) {
-                $path = str_replace(stristr($path, '?'), '', $path);
-            }
-            $args = (array)$this->parseArgs($path);
-            //处理GET或POST方法 数据结构 key1=value1 key2=value2 键和值中间不能有空格
-            if($query && strlen($query) > 1) {
-                $queryArr = explode("&", substr($query, 1));
-                foreach ($queryArr as $value) {
-                    list($index, $val) = explode('=', $value, 2);
-                    $args[$index] = $val;
-                }
-            }
-            if ($_SERVER['argc'] > 2) {
-                for ($i = 1; $i < $_SERVER['argc'] - 1; $i++) {
-                    list($index, $val) = explode('=', $argv[$i], 2);
-                    $args[$index] = $val;
-                }
-            }
-            
-            $this->pathArgs = $args;
-            if ($args && $key != '') {
-                return isset($args[$key]) ? $args[$key] : '';
-            }
+        $args = array();
+        if(!isset($_SERVER['__CLI_ARGS'])) {
             return $args;
+        }else{
+            $args = $_SERVER['__CLI_ARGS'][2];
+        }
+        if ($args && $key != '') {
+            return isset($args[$key]) ? $args[$key] : null;
         }
         return array();
     }
 
     public function getCliPathArgs() {
-        $argv = array();
         $args = array();
-        if (isset($_SERVER['argv'])) $argv = $_SERVER['argv'];
-        //修正部分服务器Rewrite 后再加参数不识别的问题(直接进入命令行的模式)
-        if ($argv && $_SERVER['PHP_SELF'] == $_SERVER['SCRIPT_NAME']) {
-            if (count($argv) == 1) return $args;
-            array_shift($argv);
-            $path = $argv[0];
-            if(stristr($path, '?')) {
-                $path = str_replace(stristr($path, '?'), '', $path);
-            }
-            $args = (array)$this->parseArgs($path);
+        if(!isset($_SERVER['__CLI_ARGS'])) {
+            return $args;
         }
-        return $args;
+        return (array) $this->parseURI($_SERVER['__CLI_ARGS'][1]);
     }
 
     /**

+ 23 - 8
src/Request/Url/Short.php

@@ -7,6 +7,27 @@ class Short extends Base implements Intf
 	{
 		parent::__construct($mode);
 	}
+
+    /**
+     * 只匹配URI中的内容
+     *
+     * @param $params
+     * @return array|void
+     * @throws \Qii\Exceptions\Unsupported
+     */
+    public function parseURI($params) {
+        $this->checkMode($this->_mode);
+        if ($params == '') return;
+        $params = ltrim($params, "/");
+        $argvArray = explode("/", $params);
+        $data = array();
+        if (is_array($argvArray)) {
+            foreach ($argvArray AS $arg) {
+                $data[] = $arg;
+            }
+        }
+        return $data;
+    }
 	/**
 	 * 解析uri获取参数 => 值
 	 * @param string $params uri
@@ -16,13 +37,7 @@ class Short extends Base implements Intf
 	{
 		$this->checkMode($this->_mode);
 		if ($params == '') return;
-		$argvArray = explode("/", $params);
-		$data = array();
-		if (is_array($argvArray)) {
-			foreach ($argvArray AS $arg) {
-				$data[] = $arg;
-			}
-		}
+        $data = $this->parseURI($params);
 		foreach ($_GET AS $key => $val) {
 			$data[$key] = $val;
 		}
@@ -36,7 +51,7 @@ class Short extends Base implements Intf
 	public function decodeArgs($urlArray, $k = '')
 	{
 		$this->checkMode($this->_mode);
-		if (!empty($k)) return $urlArray[$k] == 'NULL' ? '' : $urlArray[$k];
+		if (!empty($k)) return $urlArray[$k] == 'NULL' || $urlArray[$k] == null ? '' : $urlArray[$k];
 		return $urlArray;
 	}
 }

+ 5 - 3
src/Router/Parse/Normal.php

@@ -1,6 +1,8 @@
 <?php
 namespace Qii\Router\Parse;
 
+use Qii\Config\Register;
+
 /**
  * Route规则文件
  * 兼容以前版本的匹配规则
@@ -172,10 +174,10 @@ class Normal
         {
             if(preg_match("/\{[\d]{1,}\}/", $val)) {
                 $index = str_replace(array('{', '}'), '', $val);
-                $replacements[$key] = $dirInfo[$index] ?? 'index';
+                $replacements[$key] = isset($dirInfo[$index]) && $dirInfo[$index] != '' ? $dirInfo[$index] : Register::get("APP_DEFAULT_ACTION");
                 $rulesVal = preg_replace("/\{[\d]{1,}\}/", $replacements[$key], $rulesVal, 1);
             }else if($val == '*'){
-                $replacements[$key] = $dirInfo[$maxIndex] ?? 'index';
+                $replacements[$key] = $dirInfo[$maxIndex] ? $dirInfo[$maxIndex] : 'index';
                 //一次只替换一个,用于匹配多次
                 $rulesVal = preg_replace("/[\*]{1}/", $replacements[$key], $rulesVal, 1);
                 $maxIndex++;
@@ -183,7 +185,7 @@ class Normal
         }
         list($controller, $action) = explode(":", $rulesVal);
         $match['controller'] = $controller;
-        $match['action'] = $action ?? 'index';
+        $match['action'] = $action ? $action: Register::get("APP_DEFAULT_ACTION");
         $match['replacements'] = $replacements;
         $match['rulesVal'] = $rulesVal;