Yii自定义路由允许下划线路由访问驼峰控制器

Yii自定义路由允许下划线路由访问驼峰控制器

Yii框架使用路由美化之后, 访问格式变成了 /foo/bar 形式
但是有个问题, 如果控制名称是FooBarController, 则访问路径必须变成/foo-bar/xxx

这里为什么必须是中划线才能访问?
因为Yii框架认为/foo_bar/xxx路由应该访问Foo_BarController
而不是FooBarController
对于用惯了laravel驼峰命名格式之后, 面对这样的奇葩约定真是有一股莫名的不爽
于是, 改之。

第一步, 配置项目文件, 增加一个自定义路由类

文件: 项目目录/config/web.php
'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
                [ //这里自定义一个类, 用来重写路由请求
                    'class' => 'app\components\MyUrlRule',
                ]
            ],
        ],

第二步 在自己项目的组件命名空间对应的目录下,新增重写路由的类

getPathInfo();
        // 将美化后的url按照 “/” 分隔符分隔成控制器名和动作方法名
        $pathInfo = explode('/', $pathInfo);
        if(count($pathInfo) != 2) {
            return false;
        }

        // 将控制器的方法统一转小写并去除空白符
        $controller = strtolower(trim($pathInfo[0]));
        $action = strtolower(trim($pathInfo[1]));

        // 此处按需要, 将路由中的下划线再变为中划线以符合项目的奇葩需求,
        // 这样项目就可以解析到这个控制器ID了
        // 这里同样也可以对action进行重写, 根据自己项目的需求进行定制
        if (strpos($controller, '_')) {
            $controller = str_replace('_', '-', $controller);
        }

        $pathInfo = $controller . '/' . $action;

        return [$pathInfo, []];
    }
}

接下来就可以测试访问了, 输入路由/foo_bar/aaa_bbb_ccc
我们希望这条路由匹配到FooBarController/actionAaa_bbb_ccc

Yii自定义路由允许下划线路由访问驼峰控制器_第1张图片

下面是测试结果

Yii自定义路由允许下划线路由访问驼峰控制器_第2张图片

你可能感兴趣的:(php,框架)