Yii 1.1 迁移至 Yii 2.0 或 3.0 是结构性升级,需分阶段推进:Yii 2.0 适合 PHP 5.4–8.1 的老项目,保留部分旧思维;Yii 3.0 要求 PHP ≥ 8.2,属重写级迁移。

Yii 1.1 老项目迁移到 Yii 2.0 或 Yii 3 是一次结构性升级,不是简单替换文件就能完成的。核心难点不在语法细节,而在于架构理念、依赖管理和运行时模型的根本变化。迁移必须分阶段推进,不能“一锅端”。
先明确目标版本选型
Yii 2.0 和 Yii 3.0 定位不同,选错会大幅增加成本:
- Yii 2.0:适合仍有维护需求、PHP 版本在 5.4–8.1 区间、且不急于重构底层逻辑的老项目。它保留了部分 Yii 1.1 的思维惯性(比如 ServiceLocator),学习曲线相对平缓。
-
Yii 3.0:要求 PHP ≥ 8.2,彻底抛弃 ServiceLocator、强制依赖注入、模块拆分为独立 Composer 包(如
yii-base、yii-db)。适合新起模块或准备长期演进的系统,但对 Yii 1.1 项目属于“重写级”迁移,不建议直接全量升级。
Yii 1.1 → Yii 2.0 关键改造点
这是最常见、路径最清晰的迁移路线。重点不是重写代码,而是逐层解耦和适配:
-
入口与应用实例:全局
Yii::app()全部替换成Yii::$app;所有CController改为继承yii\base\Controller,类名去掉C前缀(如SiteController)。 -
视图与布局:控制器中
$this->layout = 'main'仍可用,但不再支持类属性直接赋值;主题路径从Yii::app()->theme->baseUrl改为Yii::$app->view->theme->baseUrl;视图内短标签= $var ?>可直接用(PHP 5.4+ 支持)。 -
表单与小部件:废弃
$this->beginWidget('CActiveForm'),改用命名空间use yii\widgets\ActiveForm,并在视图中调用ActiveForm::begin()和field()方法。 -
数据库与迁移:停用
CDbConnection,改用Yii::$app->db;手工 SQL 迁移需转为yii\db\Migration类,注意up()/down()必须幂等,生产环境禁用yii migrate/down回滚已上线变更。 -
资源管理:
Yii::app()->getClientScript()彻底移除;JS/CSS 统一通过AssetBundle管理,例如自定义AppAsset并调用register($this)。
Yii 2.0 → Yii 3.0 不是升级,是重构
Yii 3.0 没有“向后兼容层”,无法渐进式迁移。若真要跨过去,推荐策略是:
- 将 Yii 2.0 项目按功能边界拆成微服务或独立模块;
- 新模块直接用 Yii 3.0 开发,通过 API 或消息队列与旧模块通信;
- 逐步用 Yii 3.0 重写核心模块(如用户中心、订单服务),验证稳定后再切换流量;
- 放弃
Yii::createObject()和全局 ServiceLocator,全部改用构造函数注入或ContainerInterface显式获取依赖。
实操建议:别跳步,先跑通再优化
迁移不是技术竞赛,而是风险控制过程:
- 第一步永远是搭建 Yii 2.0 最小可运行骨架,连通数据库、能渲染首页;
- 把原 Yii 1.1 的配置(
main.php)逐项翻译成 Yii 2.0 的web.php和params.php,尤其注意组件注册方式; - 优先迁移模型层(ActiveRecord 对应关系、验证规则),再动控制器和视图;
- 用 PHPUnit 补基础测试用例,哪怕只覆盖登录、列表页这类主干流程,也能大幅降低回归风险。


















