yii2.0控制器须继承yii\base\controller且无c前缀,应用实例改用yii::$app;布局设置依赖findlayoutfile()动态查找;表单需use activeform并调用field();对象初始化统一用yii::createobject()且构造函数末参数为配置数组。

控制器类定义和实例获取方式变了
Yii2.0 里控制器必须继承 yii\base\Controller,且类名不再带 C 前缀;Yii1.1 是 CController。最直接的后果是:写错父类就报 Class 'CController' not found。
- Yii1.1 获取应用实例用
Yii::app(),全局唯一对象 - Yii2.0 改为静态属性访问:
Yii::$app,比如Yii::$app->request、Yii::$app->db
别在 Yii2 里继续写 Yii::app()->user —— 这会直接抛出 Fatal error: Call to undefined method Yii::app()。所有 Yii::app() 都得替换成 Yii::$app。
布局(layout)设置逻辑完全不同
Yii1.1 在控制器里设 $this->layout = 'main' 就生效,或者在父类 Controller.php 中直接赋值 $layout 变量。
Yii2.0 没有这个公共属性,它靠 findLayoutFile() 动态查找,优先级是:控制器级 $this->layout > 应用配置 'layout' => 'mine'(在 web.php)> 默认 '@app/views/layouts/main.php'。
- 如果你把
$layout = 'admin'直接写在控制器类体里(非方法内),Yii2 会静默忽略,不报错也不生效 - 想全局统一改布局,别改父类属性,去
config/web.php加配置项:'layout' => 'custom' - 单个 action 不用布局?设
$this->layout = false,不是null或空字符串
表单生成语法和命名空间必须显式声明
Yii1.1 写表单用 $this->beginWidget('CActiveForm'),框架自动加载,不用 use。
Yii2.0 必须手动引入并用新语法:
- 先加
use yii\widgets\ActiveForm; - 然后写
$form = ActiveForm::begin(); - 字段调用变成
$form->field($model, 'name'),不是$form->textField()
常见错误:
- 忘了
use,报Class 'ActiveForm' not found - 还沿用
CHtml::textField(),但 Yii2 已删掉整个CHtml类,得换yii\helpers\Html::textInput() - 表单提交按钮混用两种风格:
Html::submitButton()和$form->submit()都行,但后者已废弃,推荐前者
对象初始化和配置方式彻底重构
Yii1.1 创建组件常靠 Yii::createComponent() + 数组配置,灵活性低。
Yii2.0 统一走 Yii::createObject(),且要求构造函数最后一个参数是配置数组,比如:
class MyService extends \yii\base\Component
{
public function __construct($apiUrl, $timeout, $config = [])
{
parent::__construct($config);
}
}
- 如果你的自定义类没按这个约定写构造函数,
Yii::createObject(['class' => 'MyService', 'timeout' => 5])会丢掉配置项 - 所有核心类(如
yii\caching\FileCache)都遵循此规则,迁移时检查第三方扩展是否适配
控制器里拿服务也变了:以前 Yii::app()->cache,现在得确认配置里有没有注册该组件,否则 Yii::$app->cache 会触发 Unknown Property 异常
很多老项目卡在缓存、日志、用户组件初始化失败,根本原因就是配置没进 $config 参数,或组件名写错(比如漏掉 yii\ 命名空间前缀)











