yii 2.0 是完全重写的框架,类名、命名空间、api、配置及生命周期均变更;控制器须继承 yii\base\controller,应用实例统一用 yii::$app;layout 设置改为动态查找链;activeform 需 use 并重构语法;对象创建统一通过 yii::createobject()。

Yii 2.0 不是 Yii 1.1 的小版本迭代,而是完全重写的框架——类名、命名空间、核心 API、配置方式、生命周期钩子全部变了。直接替换文件或改几个函数名就跑不起来,必须按迁移路径重写关键模块。
Controller 类继承和 $app 获取方式完全不同
Yii 2.0 控制器必须继承 yii\base\Controller,不能再写 class SiteController extends CController;否则报错 Class 'CController' not found。应用实例也不再是 Yii::app(),所有地方都得换成 Yii::$app,比如:
-
Yii::app()->user→Yii::$app->user -
Yii::app()->db→Yii::$app->db -
Yii::app()->request->baseUrl→Yii::$app->request->baseUrl(注意:不是Yii::baseUrl)
漏改一处就会触发 Fatal error: Call to undefined method Yii::app(),且错误堆栈不提示具体哪行,容易卡在调试初期。
layout 设置逻辑从静态属性变成动态查找链
Yii 1.1 中直接在控制器里写 $layout = 'admin' 就生效;Yii 2.0 删除了该公共属性,$this->layout 只在 action 执行时起作用,且优先级为:控制器内赋值 > config/web.php 中 'layout' => 'xxx' > 默认 @app/views/layouts/main.php。
- 把
$layout = 'admin'写在类定义体里(非方法中),Yii 2.0 静默忽略,不报错也不渲染对应布局 - 想让某个 action 不用 layout,必须显式设
$this->layout = false,设成null或空字符串无效 - 全局换 layout 别动父类 Controller,去
config/web.php加配置项:'layout' => 'custom'
ActiveForm 和表单字段语法必须显式 use 并重构调用
Yii 2.0 删除了整个 CHtml 类和 CActiveForm widget,表单必须先 use yii\widgets\ActiveForm,再用新语法:
-
$form = ActiveForm::begin()替代$this->beginWidget('CActiveForm') -
$form->field($model, 'name')->textInput()替代$form->textField($model, 'name') - 按钮统一用
Html::submitButton()(来自yii\helpers\Html),$form->submit()已废弃
常见错误:忘记 use 导致 Class 'ActiveForm' not found;或混用 CHtml::textField(),直接报类不存在——因为 Yii 2.0 根本没加载这些类。
对象创建和组件配置统一走 Yii::createObject()
Yii 1.1 常用 Yii::createComponent(['class' => 'Xxx', ...]),而 Yii 2.0 强制要求构造函数最后一个参数是配置数组,且多数组件需通过依赖注入容器注册。
- 自定义组件初始化必须写成
Yii::createObject(XxxClass::class, [$param1, $param2], $config) - 数据库连接、缓存等核心组件默认已注册,直接
Yii::$app->db即可,但手动 new 实例时仍要遵守构造签名 - 配置项位置迁移明显:比如主题路径从
Yii::app()->theme->baseUrl变成Yii::$app->view->theme->baseUrl
最易被忽略的是:很多老项目里直接 new 模型或服务类,升级后若该类构造函数参数顺序/类型变了,又没配好 Yii::createObject() 的第三个参数,运行时才暴露“ArgumentCountError”,而不是启动时报错。











