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',
                ]
            ],
        ],

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

<?php

namespace app\components;

use yii\web\UrlRuleInterface;
use yii\base\BaseObject;

class MyUrlRule extends BaseObject implements UrlRuleInterface
{
    /**
     * Creates a URL using the given route and query parameters
     * 使用给定的路由和参数生成一个可访问的地址
     *
     * @param object $manager
     * @param string $route
     * @param array $params
     * @return bool
     */
    public function createUrl($manager, $route, $params)
    {
        return false;
    }

    /**
     * Parses the user request
     * 解析一个用户请求
     *
     * @param  $manager
     * @param object $request
     * @return void
     * if [[enablePrettyUrl]] is 'false' is returned if the current request cannot be successfully parsed.
     */
    public function parseRequest($manager, $request)
    {
        $pathInfo = $request->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

代码截图

下面是测试结果

测试结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__万波__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值