zoukankan      html  css  js  c++  java
  • PHP框架开发——路由器功能

    路由器的实现大致分为一下几步

    1.将 uri 和 控制器方法关联起来

    2.访问 url 时根据 uri 找到对应的绑定的控制器极其方法并执行其方法

    实现第一步我们模仿 laravel 中的那种方式使用  Route::method('uri','Controller@action');  的方式来绑定,实现如下

    <?php
    class Router
    {
        private static $get_coll = [];
    
        public static function __callStatic($name, $arguments)
        {
    
            //判断方法是否正确
            if (!in_array(strtolower($name), ["post", "get", "put", "delete", "head"])) {
                throw new Exception("只支持 【post,get,put,delete,head】 请求");
            }
    
            //判断传入的值是否合法
            if (count($arguments) != 2) {
                throw new Exception("该方法需要输入两个参数,您输入了" . count($arguments) . "个");
            }
    
            self::$get_coll[$arguments[0]][$name] = $arguments[1];
        }
    }

    这样可以将注册的路由按照数组的形式绑定好,方便我们按照 uri 和 method 快速查找出 该url是否存在或者是否允许这种 method 方式访问

    router.php

    <?php
    use vender
    outerRouter;
    
    Router::get("/message","MessageController@getMessage");
    Router::post("/message","MessageController@getMessage");
    Router::get("/test","MessageController@test");

    存储数据结构如下

    array(2) {
      ["/message"]=>
      array(2) {
        ["get"]=>
        string(28) "MessageController@getMessage"
        ["post"]=>
        string(28) "MessageController@getMessage"
      }
      ["/test"]=>
      array(1) {
        ["get"]=>
        string(22) "MessageController@test"
      }
    }

    这样能够比较方便高效的获取到绑定的控制器和方法,并且判断该路由是否允许被某种方式(get/post等)访问

    public static function getRoute($uri, $method)
        {
            $method = strtolower($method);
            if (isset(self::$get_coll[$uri])) {
                //判断方法是否一致
                if (isset(self::$get_coll[$uri][$method])) {
                    return self::$get_coll[$uri][$method];
                } else {
                    throw new Exception("method not allow");
                }
            } else {
                throw new Exception("404 not fond");
            }
        }

    第二步,当获取到路由绑定的控制器和方法时,应该执行相应的控制器和方法获取执行结果,这里我是用的是反射的方式

    list($controller,$action) = explode("@",$controller);
    //使用反射实例化类
    $ref = new ReflectionClass("app\Http\Controller\".$controller);
    $controller_instance = $ref->newInstance();
    call_user_func_array([$controller_instance,$action],[$request,$response]);

    还有一种方式效率应该更高

    $controller = "app\Http\Controller\".$controller;
    (new $controller)->$action($request,$response);

    到这里有个简单的路由功能就实现啦,当然还有很多可以优化的空间

     代码示例:https://github.com/gphper/MySwoole

  • 相关阅读:
    jQuery里使用setinterval
    关于java以及JavaScript或者更多的语言中Data类的问题
    重置input checked
    利用CSS变量实现悬浮效果
    vue 可编辑表格组件
    js 可拉伸表格
    vue 自定义拖拽指令
    vue 表格导出excel
    vue 侧边导航栏递归显示
    RUP(Rational Unified Process)统一软件过程概述
  • 原文地址:https://www.cnblogs.com/itsuibi/p/13532308.html
Copyright © 2011-2022 走看看