Symfony服务容器是一个运行时PHP对象,负责统一管理服务实例的创建、依赖注入与生命周期控制;它通过服务定义(如YAML配置)描述如何构造对象,并在请求中按需自动解析并注入依赖,默认以共享(单例)模式复用服务实例。

Symfony 服务容器不是“配置文件集合”,而是一个运行时对象管理中枢——它负责创建、复用、注入和生命周期控制所有服务实例。对新手来说,理解它不在于记住语法,而在于看清“谁在什么时候、以什么方式拿到依赖”。
服务容器到底是什么?
它是一个 PHP 对象(通常是 Container 类的实例),实现了 ContainerInterface。你不需要手动 new 它,框架启动时自动构建并传入控制器、命令等处。它的核心职责有三:
- 统一保管所有可复用的类实例(比如数据库连接、日志器、邮件发送器)
- 按需创建服务,并自动把它们依赖的其他服务塞进去(即“依赖注入”)
- 决定某个服务是每次请求都新建(prototype),还是整个请求周期只用一个(shared,默认)
服务和服务定义的区别
“服务”是运行时的一个对象(例如 App\Service\UserNotifier 的实例);“服务定义”则是告诉容器“怎么造这个对象”的蓝图,写在 config/services.yaml 里:
- 类名(
class:)指明用哪个 PHP 类来实例化 -
arguments:列出构造函数参数,其中以@开头的是其他服务名(如'@mailer') - 没写
class:时,容器默认用服务 ID 当作类名(如app.user_notifier:→ 自动找App\Service\UserNotifier)
依赖注入是怎么发生的?
你不需要在控制器里 new UserNotifier($mailer)。只要类型提示写清楚,容器就自动完成:
- 在控制器方法中直接声明类型:
public function send(UserNotifier $notifier): Response - 容器读取
UserNotifier的构造函数签名,发现它要MailerInterface - 再去找
MailerInterface绑定的是哪个具体服务(比如sendmail或smtp) - 递归完成所有依赖的实例化,最后把完整对象传给你
新手最容易忽略的两件事
第一,服务默认是“共享的”(shared),也就是单例行为——同一请求内多次获取 UserNotifier,得到的是同一个对象实例;第二,服务 ID 不一定等于类名,但必须全局唯一,且用于引用(比如 @app.user_notifier 中的 ID 就是 app.user_notifier)。


















