Symfony 2.7.10依赖注入容器通过YAML/PHP定义服务、构造函数注入为主、控制器中用$this->get()获取服务,私有服务在测试中可通过static::$kernel->getContainer()访问。

Symfony 2.7.10 的依赖注入容器是整个框架的核心机制之一,它负责管理服务的创建、生命周期和依赖关系。虽然该版本已较老(发布于2015–2016年),但其容器设计清晰、配置方式典型,对理解现代 Symfony(如 5.x/6.x)仍有参考价值。
以下是你在 Symfony 2.7.10 中实际使用依赖注入容器的关键方法:
定义服务:YAML 或 PHP 配置
服务通常在 `app/config/services.yml`(或 `services.php`)中声明。推荐使用 YAML,结构简洁易读:# app/config/services.yml
services:
app.mailer:
class: AppBundle\Mail\Mailer
arguments: ['%mailer.transport%']
app.user_repository:
class: Doctrine\ORM\EntityRepository
factory: ['@doctrine.orm.entity_manager', getRepository]
arguments: ['AppBundle\Entity\User']注意:
-
%mailer.transport%是参数占位符,需在parameters.yml中定义; -
@doctrine.orm.entity_manager是已有服务的引用,容器会自动解析; -
factory用于通过已有服务构造新实例,避免直接 new。
注入依赖:构造函数为主,支持 setter
容器默认优先通过构造函数注入依赖。例如:// src/AppBundle/Mail/Mailer.php
namespace AppBundle\Mail;
class Mailer
{
private $transport;
public function __construct($transport)
{
$this->transport = $transport;
}
}若需 setter 注入,需在服务定义中标明:
services:
app.mailer:
class: AppBundle\Mail\Mailer
calls:
- [setLogger, ['@logger']]在控制器或服务中获取服务
在 Controller 中,可直接用 `$this->get('service_id')`:public function sendAction()
{
$mailer = $this->get('app.mailer');
$mailer->send('hello@example.com');
return new Response('Sent!');
}⚠️ 注意:$this->get() 是 Controller 的快捷方式,本质调用的是 ContainerInterface::get()。不建议在实体或普通 POPO 中直接调用容器(违反单一职责),应通过构造注入传递所需服务。
访问私有服务与测试场景
Symfony 2.7 默认将多数服务设为 `private: true`(防止被外部随意调用)。若需在测试中访问:// 在 KernelTestCase 子类中
self::bootKernel();
$container = static::$kernel->getContainer();
$mailer = $container->get('app.mailer'); // 即使私有,测试容器也允许获取生产环境不鼓励绕过私有性,但测试时这是标准做法。
不复杂但容易忽略


















