直接运行php bin/console debug:container可实时查看所有已注册服务ID,按字母排序,含内置与自定义服务;私有服务默认显示,加--show-private可高亮,--format=json便于脚本解析,| grep可过滤,--types按类或接口筛选,查单个服务可验证public/autowired/参数等状态。

直接运行 php bin/console debug:container 就能看到所有已注册的服务 ID,这是最准、最实时的方式——不依赖代码猜测,也不靠文档翻找。
查看全部服务 ID 列表
命令输出按字母序排列,包含 Symfony 内置服务(如 router、doctrine.orm.default_entity_manager)和你自定义的(如 app.email_sender)。注意:私有服务(public: false)也会显示,但不能用 $container->get('id') 直接获取。
- 加
--show-private参数可高亮标出哪些是私有的 - 加
--format=json便于脚本解析(比如 CI 中做断言) - 若列表过长,可用管道过滤:
php bin/console debug:container | grep notifier
按类名或接口名筛选服务
用 --types 能快速定位某类实现是否被注册、绑定到了哪个 ID:
-
php bin/console debug:container --types | grep LoggerInterface—— 查看所有LoggerInterface绑定情况 -
php bin/console debug:container --types | grep App\Service\Notifier—— 看该类是否被自动注册,ID 是不是类名本身 - 输出中带
alias for的行说明这是别名,真实服务 ID 在冒号后
查单个服务详情确认注册状态
光看到 ID 不代表它能用。运行 php bin/console debug:container app.email_sender 可验证:
- 是否标记为
public(否则无法在测试或命令中手动get()) - 是否启用
autowired(影响构造函数注入是否生效) - 构造参数是否已解析(比如
$transport显示为%env(MAILER_DSN)%还是null) - 如果报错 “The service … does not exist”,说明 ID 拼错、没注册、或被 exclude 规则跳过了
为什么有时候 debug:container 找不到你的服务?
常见原因不是命令失效,而是注册环节断了:
- 类文件不在
services.yaml配置的resource路径下(比如放在src/Utils/但扫描只写了App: resource: '../src/Service/') - 用了
exclude却误伤了目标目录(例如exclude: '../src/{Entity,Repository}/**'把Service也排除了) - 手动定义服务时漏写了
class:,只写了app.email_sender:,YAML 解析后变成空定义 - 服务 ID 和类名完全一样,但启用了自动扫描,又在 YAML 里重复定义了一次——后者会覆盖前者,但调试时容易误以为“没注册”
真正关键的不是记住所有 ID,而是每次改完配置立刻跑一遍 debug:container,把容器当前状态当成唯一事实源。很多“服务找不到”的问题,其实只是配置没生效,而不是逻辑写错了。











