Flex recipes 不是“装完就自动生效”的魔法开关,它只在满足 recipe 匹配、环境匹配、缓存刷新三重条件时才真正把配置写进运行时;recipe 未生效主因是匹配失败、allow-contrib 关闭或缓存未按环境清理,而非 Flex 本身故障。

Flex recipes 不是“装完就自动生效”的魔法开关,它只在满足 recipe 匹配、环境匹配、缓存刷新三重条件时才真正把配置写进运行时。很多开发者看到 config/packages/mailer.yaml 生成了,却在 debug:container 里找不到服务——问题几乎从不在于 Flex 本身,而在于 recipe 没被触发或配置没被加载。
recipe 没生成 config 文件?先查这三件事
常见现象:执行 composer require symfony/notifier 后,config/packages/notifier.yaml 没出现,NotifierTransportFactory 类报错找不到。
-
composer show symfony/flex返回空?说明 Flex 根本没装,补上:composer require symfony/flex --dev -
composer config extra.symfony.allow-contrib返回false?那所有contrib类 recipe(比如doctrine/doctrine-bundle)全被拦截,删掉该配置或设为true -
composer recipes显示 ❌?说明当前包版本没对应 recipe,去 symfony/recipes 或 recipes-contrib 搜vendor/package/X.Y目录确认是否已收录
文件生成了但服务没注册?检查 bundles.php 和缓存
Flex 写完 YAML 只是第一步。Symfony 容器编译机制会跳过未激活的配置,哪怕文件存在也无效。
- 打开
config/bundles.php,确认有类似MyBundle::class => ['all' => true]的注册行——Flex 通常自动加,但若你用过--no-scripts或手动删过,就得补上 -
php bin/console cache:clear默认只清dev环境;生产环境必须显式指定:php bin/console cache:clear --env=prod - 检查 YAML 里有没有
when@prod或when@dev块,再核对当前APP_ENV值:php bin/console debug:container --parameter=kernel.environment
想改默认配置又怕被覆盖?用本地 recipe 覆盖
别直接编辑 config/packages/mailer.yaml 后等着下次 composer update 把它冲掉——Flex 支持优先级更高的本地 recipe。
- 在项目根目录建路径:
config/recipes/symfony/mailer/6.4/ - 放一个最小化
manifest.json:{"copy-from": ".", "copy-to": "."} - 再放你定制的
config/packages/mailer.yaml(支持%%APP_ENV%%占位符,Flex 会自动替换) - 下次
composer update symfony/mailer,Flex 就用你本地的模板,不再拉官网版本
recipe 生效的关键不在 Flex 版本新旧,而在是否命中匹配规则、是否允许 contrib、是否清了对应环境缓存。最容易被忽略的是 when@env 条件和 bundles.php 注册状态——这两处一错,配置文件再全也没用。


















