Yii2 路由之同时支持 URL 原始和美化的请求

▪ 前言

刚学习 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 将无法访问

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值