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');
    }
}

完工。

相关推荐
evans在进步15 分钟前
Spring Boot 工程化核心详解:Parent、Starter、热部署、事务与多数据源
spring boot·后端·python
宫水三叶的刷题日记1 小时前
馋猫外卖:AI 让字节式试错没有天花板
后端
SomeB1oody1 小时前
【RustyML入门】7.4. 按需裁剪与模块化集成
开发语言·后端·机器学习·rust·教程
罗超驿2 小时前
SpringBoot 快速入门
java·spring boot·后端
卷无止境2 小时前
除了开发api,FastAPI其实也可以配合jinja2模板写页面
后端·python·fastapi
newerp2 小时前
Redis 操作与缓存策略
后端·程序员·go
newerp2 小时前
GORM ORM 基础
后端·程序员·go
小岛前端2 小时前
AI Skills 已经封神,但新的问题却越来越严重!
前端·后端·github
拖孩3 小时前
一个人 + AI 做的小程序,上线 15 天赚了 10 块 5
前端·后端·微信小程序
newerp3 小时前
CRUD 操作与预处理语句
后端·程序员·go