yii 3.0 是基于 php 8.2+ 的彻底重写框架,弃用 servicelocator 和魔性语法,采用 psr-11 di 容器、模块化独立包(130+)、解耦模板/资源/cli,并强制要求显式依赖注入与配置。

Yii 3.0 不是 Yii 2.x 的小升级,而是彻底重写的现代 PHP 框架——它放弃魔性、拥抱显式,用 PSR 和 Composer 做底层,把“能跑”变成“好测、好换、好维护”。如果你还在用 Yii::createObject() 或依赖 ServiceLocator,那迁移前得先理清这几点。
PHP 8+ 强制要求,HHVM 和 PHP 7.x 彻底出局
Yii 3.0 要求 PHP 8.2 或更高版本(官方文档明确标注),不再兼容 PHP 7.1–8.1。这不是“建议”,而是硬性限制:框架大量使用 PHP 8 的构造器属性提升(public string $name)、联合类型(string|int|null)、#[\Attribute] 元数据,以及 mixed 类型声明。HHVM 已被完全移除支持,Composer 自动加载取代了 Yii 自研 autoloader。
常见错误现象:Fatal error: Uncaught Error: Call to undefined function yii\di\is_callable() —— 这往往是因为 PHP 版本低于 8.2,或启用了旧版扩展导致类型检查失败。
- 部署前务必运行
php -v确认版本 ≥ 8.2 - CI/CD 流水线中需显式指定 PHP 镜像,如
php:8.3-apache,避免默认拉取 8.1 -
composer create-project yiisoft/app在 PHP 8.1 下会直接报错退出,不会静默降级
DI 容器替代 ServiceLocator,所有依赖必须显式声明
Yii 3.0 删除了全局 Yii::$app->get('db') 这类隐式访问方式。Application 和 Module 类不再继承 ServiceLocator,所有组件都通过 PSR-11 兼容的 DI 容器注入——要么在构造函数里写明,要么在配置数组中绑定接口到实现。
使用场景:你不能再在任意控制器方法里随手调用 Yii::getContainer()->get(LoggerInterface::class),而要让控制器本身接收该依赖:
final class SiteController
{
public function __construct(
private LoggerInterface $logger,
private ResponseInterface $response,
) {}
}
容易踩的坑:
- 迁移老项目时,
Yii::$app->user、Yii::$app->request这类写法全部失效,必须重构为构造注入或参数传递 - 自定义行为(Behavior)若依赖
$this->owner->get(...),需改为通过容器传入所需服务实例 - DI 配置项放在
config/common.php中,格式为键值对:LoggerInterface::class => ['class' => FileLogger::class],不是 YAML 或 XML
模块化包体系:130+ 独立包,按需组合
Yii 3.0 没有“单一框架包”,只有 yiisoft/core、yiisoft/di、yiisoft/router、yiisoft/view 等独立 Composer 包。你用不到的功能,就不用装——比如纯 API 项目可跳过 yiisoft/yii-web,只装 yiisoft/yii-base-api 和 yiisoft/http。
性能与兼容性影响:
- vendor 包体积明显减小(典型 Web 应用比 Yii 2.0 少 30%+ 依赖)
- 更新某个组件(如路由)不再牵连整个框架,
composer update yiisoft/router即可 - 第三方库集成更自然:直接
composer require monolog/monolog,再在 DI 配置中绑定LoggerInterface到Monolog\Logger实例 - 注意:部分包(如
yiisoft/validator)仍处于 alpha 阶段,生产环境需核对其稳定标签(^3.0.0而非dev-main)
模板引擎、资源管理、CLI 工具全解耦
Yii 3.0 不再内置视图渲染逻辑,yiisoft/view 是一个轻量 PSR-17 兼容的渲染器,不绑定 Twig 或 Blade;前端资源(CSS/JS)也不再通过 AssetBundle 管理,而是交由 Foxy 或 asset-packagist 处理;CLI 命令也从核心剥离,yii serve 来自 yiisoft/yii-base-cli,yii migrate 来自 yiisoft/db-migration。
这意味着:
- 你不能直接在
views/site/index.php里用$this->registerJs(),得自己引入 JS 或用现代构建工具(Vite + PHP proxy) -
gii代码生成器已移出主仓库,需单独安装yiisoft/gii并手动注册命令 - 调试器(debug toolbar)不再是开箱即用,要
composer require yiisoft/debug并启用中间件 - 项目初始化后,
public/index.php仅剩几行引导代码,所有逻辑都在 DI 配置和中间件链中
最易被忽略的一点:Yii 3.0 的“应用模板”(如 yiisoft/app)只是预设配置集合,它不提供业务逻辑骨架。你删掉 config/web.php 里的路由定义,整个 Web 层就不存在了——框架真的只做“基础设施”,不做“约定俗成”。











