mycjk31 2017-07-31 22:27:54 6946次浏览 1条评论 2 0 0

▪ 前言

刚学习 Yii2 的时候我们都是直接采用了 URL 原始访问方法:

http://frontend.domain.com/index.php?r=index/site/index
http://frontend.domain.com/index.php?r=index/article/view&id=1
...

经过一段时间的学习,我们又学会了 URL 美化:

http://frontend.domain.com/index/site/index.html
http://frontend.domain.com/index/article/view/id/1.html
...

但是你有没有发现:启用了 URL 美化之后,URL 原始的访问方法就不能再用了,除非你关闭 URL 美化。

▪ 原理

通过查看 yii\web\urlManager 源码中的 parseRequest() 方法我们可以发现其中的奥秘:

public function parseRequest($request)
{
    if ($this->enablePrettyUrl) {
        ...
    }else{
        ...
    }
}

parseRequest() 是一个 URL 解析方法,从访问的 URL 中解析出路由,然后 Yii2 根据路由信息构建并调用出相应的模块、控制器、方法等等

源码中对 $this->enablePrettyUrl 做了判断,如果开启美化,那么就不进行原始的解析。反之亦然。

▪ 共存

通常情况下,我们的项目都会开启 URL 美化。但是有时个别 URL 为保证其通用性,你可能需要为其构建原始形态来访问。

不要问为什么会有这么奇怪的需求,看看下面的解决方法,当你如果真遇到这样的需求时你就能这样处理了

但是很不幸,你构建的原始形态的 URL 无法访问到 Yii2 对应的控制器。因为此时 Yii2 启用了 URL 美化,无法将原始形态的 URL 解析到指定的路由。

好在 Yii2 非常灵活,我们重写 urlManagerparseRequest() 实现它。

  1. 新建文件 common/components/urlManage.php,其内容如下:
<?php
namespace common\components;

use yii;

/**
 * URL 管理器
 * 继承官方 URL 管理器,同时支持 URL 原始和美化的请求
 */
class urlManager extends yii\web\urlManager
{
    /**
     * 解析请求路由
     * 同时支持 URL 原始和美化的请求解析
     *
     * @param yii\web\Request $request
     * @return array|bool
     */
    public function parseRequest( $request )
    {
        $route = trim($request->get($this->routeParam));
        $enablePrettyUrl = $this->enablePrettyUrl;

        if( $route != '' ) $this->enablePrettyUrl = false;
        $result = parent::parseRequest($request);
        if( $route != '' ) $this->enablePrettyUrl = $enablePrettyUrl;

        return $result;
    }
}
  1. 应用主体 的配置文件中将该新的 urlManager 类添加;例如编辑 /frontend/config/main.php,添加如下代码:
$configs['components']['urlManager'] = array('class'=>'common\components\urlManager');
  1. 至此,你就可以同时使用以下的 URL 进行访问:
http://frontend.domain.com/index.php?r=index/site/index
http://frontend.domain.com/index.php?r=index/article/view&id=1
...

http://frontend.domain.com/index/site/index.html
http://frontend.domain.com/index/article/view/id/1.html
...

注意:前提需要你开启了 URL 的美化,不然 xxx.html 那几个 URL 将无法访问

  • 评论于 2017-12-27 16:39 举报

    只要不强制严格的url解析就可以了,另外也可以定义规则模仿原本的写法定义。这样可以更快的实现你要的结果

    1 条回复
    评论于 2018-01-24 08:23 回复

    恩嗯,我试试

您需要登录后才可以评论。登录 | 立即注册