Yii 3.0 是基于 PHP 8.2+ 的彻底重写框架,弃用 Yii::$app 和 ServiceLocator,强制 PSR-11 容器、显式依赖注入、PSR-15 中间件及模块化独立包(130+)。

Yii 3.0 不是 Yii 2.x 的升级补丁,而是彻底重写的现代 PHP 框架——它要求你放弃 Yii::$app、Yii::createObject() 和隐式服务访问,转而用 PSR-11 容器 + 构造函数注入 + 显式配置来组织代码。如果你的项目还在跑 PHP 8.1 或更低版本,现在就该停下手里的迁移计划,先升级环境。
PHP 8.2+ 是硬性门槛,不是可选项
Yii 3.0 在源码中大量使用 PHP 8.2 新特性:构造器属性提升(public string $name)、联合类型(string|int|null)、#[\Attribute] 元数据、mixed 类型声明,以及强制的 declare(strict_types=1)。这些不是“锦上添花”,而是框架运行的基础。
- 常见错误:
Fatal error: Uncaught Error: Call to undefined function yii\di\is_callable()—— 很大概率是 PHP 版本低于 8.2,或启用了不兼容的扩展 - CI/CD 流水线必须显式指定镜像,例如
php:8.3-apache;用php:8.1拉取会直接失败,不会降级或警告 -
composer create-project yiisoft/app在 PHP 8.1 下执行会立即退出并报错,不会创建任何文件
DI 容器取代 ServiceLocator,所有依赖必须显式声明
Yii 3.0 彻底删除了 Application 和 Module 对 ServiceLocator 的继承,Yii::$app->db、Yii::$app->user 这类写法全部失效。组件不再“自动可用”,而是必须通过容器注册并注入。
- 控制器不能在方法里随手调用
Yii::getContainer()->get(LoggerInterface::class),得写成构造函数参数:public function __construct(private LoggerInterface $logger) - 自定义
Behavior若原来依赖$this->owner->get('cache'),现在必须把CacheInterface作为构造参数传入,或由容器自动解析 - 全局配置项统一放在
config/common.php中,格式为键值对:LoggerInterface::class => ['class' => FileLogger::class],不支持 YAML 或 XML
PSR-15 中间件驱动请求生命周期,控制器行为完全重构
Yii 3.0 的 yii\web\Application 不再继承 yii\base\Application,而是实现 PSR-15 协议。整个请求流程走中间件栈,beforeAction、afterAction、init() 等钩子全部移除,事件系统也大幅精简。
立即学习“PHP免费学习笔记(深入)”;
- 权限控制、日志记录、响应包装等逻辑需改写为独立中间件,不能再靠控制器基类统一处理
-
actionIndex()不再自动映射到/index,路由必须显式配置,或使用属性路由:#[Route('GET /')] -
Yii::$app->response是只读的ResponseInterface实例,不能直接赋值statusCode,须用$response->withStatus(404)链式调用
调试工具栏默认不启用,没有它你就看不到 SQL 和性能数据
Yii 3.0 默认不加载任何调试工具栏(Debug Toolbar),yiisoft/yii-debug 是独立扩展包,且必须手动注册为中间件,并配置允许的 IP 地址段。这不是遗漏,是设计选择——框架本身不承担调试职责,只提供接口。
- 没装
yiisoft/yii-debug,你连一次请求里执行了哪些 SQL、耗时多少、内存占用峰值都看不到 - 即使安装了,若没在
config/debug.php中配置'allowedIPs' => ['127.0.0.1', '::1'],工具栏也不会显示 - 调试中间件必须插入到中间件栈的合适位置(通常在最外层),否则无法捕获完整生命周期数据
最易被忽略的一点:Yii 3.0 的模块化不是“功能开关”,而是真实物理拆分——yiisoft/yii-core、yiisoft/di、yiisoft/router 等 130+ 包各自独立发布、独立更新。你改一个路由配置,可能要同时确认 yiisoft/router 和 yiisoft/yii-web 的版本兼容性。



















