Yii 中多版本控制器的实现

需求:浏览器访问 reports/daily 时,使其默认转到 v1 版本,若 URL 参数带有版本参数 version,则转到对应的版本代码。

  • reports/daily -> modules/reports/controllers/v1/DailyController.php
  • reports/daily?version=v2 -> modules/reports/controllers/v2/DailyController.php

目录结构如下:

vbnet 复制代码
modules/
├── reports/
│   ├── controllers/
│   │   ├── v1/
│   │   │   └── DailyController.php
│   │   └── v2/
│   │       └── DailyController.php
│   └── views/
│       ├── v1/
│       │   └── daily/
│       │       └── index.php
│       └── v2/
│           └── daily/
│               └── index.php
└── Module.php

首先,修改 Module.php 文件,在模块初始化时从 URL 中解析 version 参数

php 复制代码
// Module.php
public function init()
{
    parent::init();

    $version = $this->getVersionFromQueryString();
    // 修改命名空间
    $this->controllerNamespace = sprintf('app\modules\reports\controllers\%s', $version);
}


protected function getVersionFromQueryString(): string
{
    $request = \Yii::$app->request;
    $version = $request->get('version', 'v1');
    if (!in_array($version, ['v1', 'v2'])) {
        $version = 'v1';
    }
    return $version;
}

此外,还需重写模块获取视图路径的方法

php 复制代码
// Module.php
public function getViewPath(): string
{
    return $this->basePath . '/views/' . $this->getVersionFromQueryString();
}

若不重写获取视图路径方法,加载视图时需要指定详细路径 $this->render('@reports/views/v1/daily/index'),非常麻烦!

控制器代码如下

php 复制代码
// v1/DailyController.php
namespace app\modules\reports\controllers\v1;

use yii\web\Controller;

class DailyController extends Controller
{
    public function actionIndex(): string
    {
        // 只需要 index 即可找到对应控制器的视图
        return $this->render('index');
    }
}

完工。

相关推荐
爬山算法4 分钟前
Netty(19)Netty的性能优化手段有哪些?
java·后端
Tony Bai5 分钟前
Cloudflare 2025 年度报告发布——Go 语言再次“屠榜”API 领域,AI 流量激增!
开发语言·人工智能·后端·golang
想用offer打牌18 分钟前
虚拟内存与寻址方式解析(面试版)
java·后端·面试·系统架构
無量22 分钟前
AQS抽象队列同步器原理与应用
后端
9号达人1 小时前
支付成功订单却没了?MyBatis连接池的坑我踩了
java·后端·面试
用户497357337981 小时前
【轻松掌握通信协议】C#的通信过程与协议实操 | 2024全新
后端
草莓熊Lotso1 小时前
C++11 核心精髓:类新功能、lambda与包装器实战
开发语言·c++·人工智能·经验分享·后端·nginx·asp.net
追逐时光者2 小时前
精选 8 个 .NET 开发实用的类库,效率提升利器!
后端·.net
a程序小傲2 小时前
京东Java面试被问:Fork/Join框架的使用场景
java·开发语言·后端·postgresql·面试·职场和发展
想用offer打牌2 小时前
面试官问Redis主从延迟导致脏数据读怎么解决?
redis·后端·面试