Yii自定义UrlRuleInterface时如何获取URL控制器与动作并补全/后缀
问题根因
你自定义实现UrlRuleInterface时没有复用Yii默认的URL规范化逻辑,所以全局配置的suffix和UrlNormalizer不会对自定义规则生效,需要你自己处理后缀校验和跳转逻辑。
方案1:直接在现有逻辑中补全跳转(不需要解析控制器动作)
你不需要手动获取对应的控制器和动作,直接构造补全/后缀的URL触发重定向即可,重定向后的带后缀请求会被Yii自动解析到对应控制器,代码修改如下:
public function parseRequest($manager, $request) { $pathInfo = $request->getPathInfo(); $matches = explode('/', $pathInfo); //若数组最后一位为空则删除 if (empty(end($matches))) { unset($matches[count($matches) - 1]); // 拼接路由参数返回即可,可补充你自定义规则的参数解析逻辑 $route = implode('/', $matches); return [$route, []]; } else { // 拼接带/后缀的路径,保留原有GET查询参数 $normalizedPath = implode('/', $matches) . '/'; $queryString = $request->getQueryString(); $redirectUrl = $request->getBaseUrl() . '/' . $normalizedPath . ($queryString ? '?' . $queryString : ''); // 发送301永久重定向 \Yii::$app->response->redirect($redirectUrl, 301)->send(); exit; } }
方案2:更推荐的实现方式(复用Yii原生逻辑)
不要直接实现UrlRuleInterface,改为继承Yii原生的yii\web\UrlRule类,只重写你需要自定义的逻辑部分,父类会自动应用全局配置的suffix、UrlNormalizer规则,你完全不需要自己写后缀校验、跳转的代码,全局配置的强制/后缀规则会自动对自定义规则生效。
内容的提问来源于stack exchange,提问作者Shaho
相关产品推荐
相关产品推荐

