Pārlūkot izejas kodu

update request route response and funcs

朱金辉 1 gadu atpakaļ
vecāks
revīzija
967ce2d9c2
4 mainītis faili ar 95 papildinājumiem un 16 dzēšanām
  1. 13 1
      src/Base/Request.php
  2. 1 1
      src/Base/Response.php
  3. 43 13
      src/Base/Route.php
  4. 38 1
      src/Functions/Funcs.php

+ 13 - 1
src/Base/Request.php

@@ -5,7 +5,6 @@ namespace Qii\Base;
 use Qii\Config\Consts;
 use Qii\Config\Register;
 use Qii\Request\Url;
-
 abstract class Request
 {
     public $host = '';
@@ -214,6 +213,19 @@ abstract class Request
     }
 
     /**
+     * 获取header信息
+     * @param $key
+     * @return array|false|mixed|string|null
+     */
+    public function head($key = null) {
+        $header = getallheaders();
+        $key = ucwords($key);
+        if($key != null) {
+            return isset($header[$key]) ? $header[$key] : null;
+        }
+        return $header;
+    }
+    /**
      * isOptions
      *
      * @param void

+ 1 - 1
src/Base/Response.php

@@ -199,7 +199,7 @@ class Response
     /**
      * Send the response, including all headers
      *
-     * @return void
+     * @return mixed
      */
     public function response()
     {

+ 43 - 13
src/Base/Route.php

@@ -1,14 +1,27 @@
 <?php
 namespace Qii\Base;
 
-use Qii\Autoloader\Psr4;
 use Qii\Config\Consts;
 use Qii\Config\Register;
+use Qii\Exceptions\InvalidFormat;
 use Qii\Exceptions\Variable;
 use Qii\Request\Http;
 
 /**
  * Route
+ * 使用方法,在路由文件夹中创建路由文件,内容如下:
+ * Route::prefix("/test")->setMiddleware([test\middleware\verify::class])->group(function($route) {
+ *      // /test/testa -> test\index::indexAction
+ *      $route->any('/test/testa', test\index::class);
+ *      // /test2/login.html 会调用 test\index::loginAction
+ *      $route->any('/test2/login', [test\index::class, 'login']);
+ * });
+
+ * Route::prefix('/test')->setMiddleware(['admin\system\middleware\user'])->group(function ($route){
+ *      // /test/manage/atest.html 会调用 remote\manage::atest,以下两种写法都可以
+ *      $route->any('/manage/*', [remote\manage::class, '$2']);
+ *      $route->any('/manage/*', remote\manage::class.':$2');
+ * });
  */
 class Route
 {
@@ -363,12 +376,38 @@ class Route
                 $res = call_user_func_array($callable, $args);
                 break;
             case is_array($callable):
-                $action = (isset($callable[1]) ? $callable[1] : "index"). Register::get(Consts::APP_DEFAULT_ACTION_SUFFIX);
-                $controllerCls = _loadClass($callable[0]);
+            case gettype($callable) == 'string':
+                //支持路由格式
+                // $route->any('/default/*', ['class', '$2']); 这里的$2值的是request->get(2)这个值
+                if(is_array($callable)) {
+                    $action = (isset($callable[1]) ? $callable[1] : Register::get("APP_DEFAULT_ACTION"));
+
+                    $controllerCls = _loadClass($callable[0]);
+                }else{
+                    if(strpos($callable, ":") > 0) {
+                        $split = explode(":", $callable);
+                        $callable = $split[0];
+                        $action = $split[1];
+                    }else{
+                        $action = Register::get("APP_DEFAULT_ACTION");
+                    }
+                    $controllerCls = _loadClass($callable);
+                }
+
+                preg_match('/\$\d$/', $action, $match);
+                if($match) {
+                    $key = ltrim($action, '$');
+                    $action = $request->get($key, Register::get("APP_DEFAULT_ACTION"));
+                }
+                $action = $action . Register::get(Consts::APP_DEFAULT_ACTION_SUFFIX);
+
+                if(preg_match("/^\d/", $action)) {
+                    throw new InvalidFormat('方法名不能以数字开头');
+                }
+
                 if(method_exists($controllerCls, 'beforeRun') && !$controllerCls->beforeRun()) {
                     return true;
                 }
-
                 if(count($middleware) > 0 && !$this->handleMiddleware($middleware)) {
                     return true;
                 }
@@ -380,15 +419,6 @@ class Route
                 }
                 $res = call_user_func_array(array($controllerCls, $action), $args);
                 break;
-            case gettype($callable) == 'string':
-                if(count($middleware) > 0 && !$this->handleMiddleware($middleware)) {
-                    return true;
-                }
-                $res = call_user_func_array(
-                        array(_loadClass($callable),
-                            Register::get("APP_DEFAULT_ACTION").  Register::get(Consts::APP_DEFAULT_ACTION_SUFFIX)), $args);
-
-                break;
         }
         if($res instanceof Response) {
             echo $res->response();

+ 38 - 1
src/Functions/Funcs.php

@@ -3,7 +3,44 @@
 use Qii\Autoloader\Import;
 use Qii\Autoloader\Psr4;
 use Qii\Language\Loader;
-
+if (!function_exists('getallheaders')) {
+    /**
+     * Get all HTTP header key/values as an associative array for the current request.
+     *
+     * @return string[string] The HTTP header key/value pairs.
+     */
+    function getallheaders()
+    {
+        $headers = array();
+        $copy_server = array(
+            'CONTENT_TYPE'   => 'Content-Type',
+            'CONTENT_LENGTH' => 'Content-Length',
+            'CONTENT_MD5'    => 'Content-Md5',
+        );
+        foreach ($_SERVER as $key => $value) {
+            if (substr($key, 0, 5) === 'HTTP_') {
+                $key = substr($key, 5);
+                if (!isset($copy_server[$key]) || !isset($_SERVER[$key])) {
+                    $key = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', $key))));
+                    $headers[$key] = $value;
+                }
+            } elseif (isset($copy_server[$key])) {
+                $headers[$copy_server[$key]] = $value;
+            }
+        }
+        if (!isset($headers['Authorization'])) {
+            if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) {
+                $headers['Authorization'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION'];
+            } elseif (isset($_SERVER['PHP_AUTH_USER'])) {
+                $basic_pass = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : '';
+                $headers['Authorization'] = 'Basic ' . base64_encode($_SERVER['PHP_AUTH_USER'] . ':' . $basic_pass);
+            } elseif (isset($_SERVER['PHP_AUTH_DIGEST'])) {
+                $headers['Authorization'] = $_SERVER['PHP_AUTH_DIGEST'];
+            }
+        }
+        return $headers;
+    }
+}
 /**
  * Qii ...
  * @return null|Qii|Qii\Autoloader\Psr4