yii1升级到yii2必须模块化重构而非简单替换,涉及全局对象访问、命名空间、配置、视图、数据库及生命周期等全方位变更。

直接替换文件、改几个类名就想跑通 Yii1 到 Yii2 的升级,基本会失败。这不是小版本迭代,而是框架重写,必须按模块重构,不是“改语法”,是重设计。
Yii::$app 替代 Yii::app() 是全局性改动
所有 Yii::app()->xxx 调用都得重写,且不能在控制器构造函数里提前访问视图或布局相关属性——此时组件尚未初始化。
-
Yii::app()->request→Yii::$app->request -
Yii::app()->user→Yii::$app->user -
Yii::app()->db→Yii::$app->db -
Yii::app()->theme->baseUrl→Yii::$app->view->theme->baseUrl或视图中用$this->theme->baseUrl - 配置参数读取从
Yii::app()->params['key']改为Yii::$app->params['key']
命名空间和类引用必须重组织
Yii1 的 CController、CActiveRecord 等全部废弃,Yii2 使用 PSR-4 自动加载,类路径即命名空间路径,不加 use 就报 Class not found。
- 控制器必须继承
yii\base\Controller(Web)或yii\console\Controller(CLI),而非CController - 模型要改用
yii\db\ActiveRecord,并声明namespace app\models;,删掉旧的model()静态工厂方法 - 配置中
'import'字段必须删除,Yii1 的路径别名加载(如Yii::import('application.models.*'))已失效 - 数据库配置字段
'connectionString'改为'dsn';Memcached 的username/password需提到与'class'同级
视图和表单逻辑完全重写
CActiveForm 彻底移除,renderPartial 行为也变了,资源注册方式更严格,不按新范式写,页面脚本会丢失。
- 表单字段不再用
$form->textField($model, 'name'),改为$form->field($model, 'name')->textInput()链式调用 - 提交按钮用
Html::submitButton(),$form->submit()已不存在 - 布局路径由
view组件统一管理,默认查找@app/views/layouts,$this->layout = 'main'仍可用,但依赖layoutPath配置 -
Yii::app()->getClientScript()->registerJsFile()全部替换为Yii::$app->view->registerJsFile()或视图中$this->registerJsFile() - 自定义资源必须封装进
AssetBundle类(如AppAsset),再通过AppAsset::register($this)注入
数据库操作和模型行为差异大
ActiveRecord 查询链式化,isNewRecord 显式设置、验证规则定义方式、默认值初始化位置都变了,不注意这些,数据写入或校验会静默失败。
- 查单条:
App::model()->find('id=:id', [':id' => 1])→App::findOne(1)或App::find()->where(['id' => 1])->one() - 批量插入需显式设
$model->isNewRecord = true,否则save()可能执行 UPDATE 而非 INSERT - 字段默认值不能靠
public $status = 1;,必须在init()方法里赋值 - 场景(scenario)不再通过
validate($scenario)参数传入,而是先设$model->scenario = 'create'再调用$model->validate() - 关系预加载用
with(),但 JOIN 行为更可控,joinWith()和innerJoinWith()分开提供
最易被忽略的是:控制器里不该在 __construct() 中操作 $this->view 或 $this->layout;模型字段默认值必须挪到 init();资源不走 AssetBundle 就大概率不生效;还有——PHP 版本至少得是 5.4,否则连命名空间都解析不了。











