首页 > 编程语言 >ThinkPHP5.1路由改进

ThinkPHP5.1路由改进

时间:2022-12-22 10:44:07浏览次数:46  
标签:option route request 改进 result elseif ThinkPHP5.1 路由

thinkphp/library/think/route/Rule.php
第794行:
protected function dispatch($request, $route, $option)
    {
        if ($route instanceof \Closure) {
            // 执行闭包
            $result = new CallbackDispatch($request, $this, $route);
        } elseif ($route instanceof Response) {
            $result = new ResponseDispatch($request, $this, $route);
        } elseif (isset($option['view']) && false !== $option['view']) {
            $result = new ViewDispatch($request, $this, $route, is_array($option['view']) ? $option['view'] : []);
        } elseif (!empty($option['redirect']) || 0 === strpos($route, '/') || strpos($route, '://')) {
            // 路由到重定向地址
            $result = new RedirectDispatch($request, $this, $route, [], isset($option['status']) ? $option['status'] : 301);
        } elseif (false !== strpos($route, '\\')) {
            // 路由到方法
            $result = $this->dispatchMethod($request, $route);
        } elseif (0 === strpos($route, '@')) {
            // 路由到控制器
            $result = $this->dispatchController($request, substr($route, 1));
        } else {
            // 路由到模块/控制器/操作
            $result = $this->dispatchModule($request, $route);
        }

        return $result;
    }

改成:

protected function dispatch($request, $route, $option)
    {
        if ($route instanceof \Closure) {
            // 执行闭包
            $result = new CallbackDispatch($request, $this, $route);
        } elseif ($route instanceof Response) {
            $result = new ResponseDispatch($request, $this, $route);
        } elseif (is_array($route) && count($route) == 2){
            $result = $this->dispatchMethod($request, $route[0] . '@' . $route[1]);
        } elseif (isset($option['view']) && false !== $option['view']) {
            $result = new ViewDispatch($request, $this, $route, is_array($option['view']) ? $option['view'] : []);
        } elseif (!empty($option['redirect']) || 0 === strpos($route, '/') || strpos($route, '://')) {
            // 路由到重定向地址
            $result = new RedirectDispatch($request, $this, $route, [], isset($option['status']) ? $option['status'] : 301);
        } elseif (false !== strpos($route, '\\')) {
            // 路由到方法
            $result = $this->dispatchMethod($request, $route);
        } elseif (0 === strpos($route, '@')) {
            // 路由到控制器
            $result = $this->dispatchController($request, substr($route, 1));
        } else {
            // 路由到模块/控制器/操作
            $result = $this->dispatchModule($request, $route);
        }

        return $result;
    }

优点:路由可以这样定义:

Route::get('hello/:name', [\app\index\controller\Index::class, 'hello']);

,编辑器里可以观察到方法是否被引用:

 

标签:option,route,request,改进,result,elseif,ThinkPHP5.1,路由
From: https://www.cnblogs.com/felixwan/p/16997865.html

相关文章

  • 基于 Dubbo-Admin 实现根据请求条件路由
    Dubbo提供动态创建条件路由的服务治理能力,可以在无需重启应用的情况下,根据请求发起方、请求的方法条件路由。Dubbo可以通过XML配置,注解配置,动态配置实现动态根据请求条件路......
  • 基于 Dubbo-Admin 实现根据请求条件路由
    Dubbo提供动态创建条件路由的服务治理能力,可以在无需重启应用的情况下,根据请求发起方、请求的方法条件路由。Dubbo可以通过XML配置,注解配置,动态配置实现动态根据请求条件......
  • .net 6 全局路由扩展
    1、先定义一个类,用来实现IApplicationModelConvention 接口///<summary>///全局路由前缀配置///</summary>publicclassRouteConvention:IApplic......
  • .net core web api 路由约束
    路由约束在传入URL发生匹配时执行,URL路径标记为路由值。路径约束通常检查通过路径模板关联的路径值,并对该值是否为可接受做出对/错决定。某些路由约束使用路由值以外......
  • 将路由器从弱电箱里解放出来
    由于家里各个房间的网线的汇聚口是弱电箱,我们一般就把路由器放到弱电箱中,但是随着路由器性能越来越强大,发热也是越来越强,弱电箱已经不适合放路由器了,并且把路由器放弱电箱......
  • [react] 路由
    文章目录​​1.相关理解​​​​1.1.SPA的理解​​​​1.2.路由的理解​​​​1.2.1什么是路由?​​​​1.2.2路由分类​​​​2.react-router-dom相关API​​​​2.1......
  • TP6在路由文件中同时使用跨域和中间件引起的跨域失败问题的解决过程
    在TP6文档中,写路由文件可以连贯操作middleware和allowcrossdomain,并且里面可以配置参数,我一偷懒,就两个都用了,如下图,之前没有增加Middleware的时候好使,能跨域,但后来要用中间......
  • vue-router3,点击相同的路由,会报错NavigationDuplicated
    vue-router点击相同的路由链接会报错NavigationDuplicated{"_name":"NavigationDuplicated","name":"NavigationDuplicated","message":"Navigatingto......
  • vue3 + ts 路由换标题
    npminstallvue-wechat-title--save//引入换标题的插件importVueWechatTitlefrom'vue-wechat-title'//使用插件VueWechatTitleapp.use(store).use(router)......
  • Vue路由配置项meta使用
    meta简单来说就是路由元信息也就是每个路由身上携带的信息。这里简单的举两个例子其次还有一个功能就是能够控制公共组件的显示或隐藏请忽视keep-alive标签......