Flex 仅在 post-package-install 和 post-package-update 事件触发时工作,即执行 composer require、update 或 remove 时才扫描并应用 recipe;若无相关日志则说明未触发。

Composer require 时 Flex 怎么知道该不该干活?
Flex 不是全程监听所有 Composer 操作,它只在 post-package-install 和 post-package-update 这两个事件触发时介入。也就是说,只有你执行 composer require、composer update 或 composer remove 时,Flex 才会开始扫描刚安装/更新/卸载的包,再决定是否拉取 recipe。
常见错误现象:运行 composer require symfony/mailer 后,config/packages/mailer.yaml 没生成,debug:container 也看不到服务——大概率是因为 Flex 根本没触发。
- 检查日志里有没有
[Symfony\Flex\Recipe] Installing symfony/mailer (6.4.0)这行,没有就说明 Flex 插件未接管 - 确认
composer show symfony/flex有返回版本号(不是not found) - 检查
composer.json中是否存在"extra": {"symfony": {"allow-contrib": true}},缺了这行,contrib 类 recipe(如doctrine/doctrine-bundle)直接被跳过 - 稳定版限制:Flex 默认忽略
-dev、-alpha、-RC等非稳定版本,用composer require vendor/package:^2.0@stable强制走稳定通道
recipe 匹配失败的三个高频原因
Flex 找不到 recipe 并不等于包不兼容,而是匹配链断在了某个环节。最常卡在 recipe 仓库、版本范围、或本地配置三处。
- 去 symfony/recipes 或 symfony/recipes-contrib 手动搜
vendor/package/X.Y目录(例如doctrine/doctrine-bundle/2.10),确认 recipe 是否已收录;新发版的包常有几天延迟 - Flex 匹配 recipe 依赖精确的
package:version范围,比如symfony/mailer:6.4对应symfony/mailer/6.4目录,但如果你装的是6.4.3,而 recipe 只定义到6.4,它仍能命中;若装的是6.5.0-RC1,则完全不匹配 - 禁用行为可能残留:运行
composer config extra.symfony.allow-contrib,如果返回false,就得立刻改回来;环境变量SYMFONY_SKIP_RECIPES=1也会全局屏蔽
Flex 写进项目的文件,为什么容器不认?
recipe 成功复制了 config/packages/my_bundle.yaml,不代表 bundle 就加载了。Symfony 的配置生效链条比文件落地长得多。
-
config/bundles.php必须包含对应注册行,例如MyBundle::class => ['all' => true];Flex 通常自动追加,但如果你删过、或上次用了--no-scripts,就不会写 - 缓存必须按环境清理:
php bin/console cache:clear默认只清dev环境,prod下得加--env=prod;更彻底的做法是手动删掉var/cache/整个目录 - 留意 YAML 文件里的
when@dev或when@prod条件块——Flex 会原样写入,但当前APP_ENV值不匹配时,整段配置就被忽略(查法:php bin/console debug:container --parameter=kernel.environment)
为什么 composer recipes 显示 ✅ 却还是报错?
composer recipes 只反映 recipe 文件是否成功写入项目,不验证 Symfony 运行时是否真正加载。它显示 ✅,只代表 Flex 完成了“写文件”这一步,后面全靠 Symfony 自己解析和编译。
- 冲突提示 ⚠️ 很关键:如果某 recipe 显示 ⚠️,说明目标文件(如
config/bundles.php)已存在且被修改过,Flex 会跳过合并——此时你得手动核对内容是否完整 - 多个 recipe 写同一文件(如都改
config/packages/framework.yaml)时,Flex 不做智能合并,后安装的 recipe 会覆盖前一个;没有冲突检测,也没有回滚机制 - recipe 本身不校验语法:如果 manifest.json 里
copy-from指向一个不存在的模板文件,Flex 会静默失败,日志里只报“file not found”,但状态仍显示 ✅


















