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
下面是测试结果