【问题标题】:Symfony2 Dependency Injection / Service ContainerSymfony2 依赖注入/服务容器
【发布时间】:2026-01-05 00:45:01
【问题描述】:

我是 Symfony2 的新手,并且已经构建了一个自定义 CMS,其中包含用户管理、页面管理、图像库等各个部分。我想记录 CMS 中的所有活动,因此认为最好创建一个集中的类来存储活动,以便我可以从任何部分调用它。

我一直在研究依赖注入和服务容器,但很难弄清楚它们之间的区别是什么?如果有的话?

我已经设置了以下服务,但想了解这是否是最佳方法:

# app/config/config.yml
# AdminLog Configuration
services:
    admin_log:
        class:        xyz\Bundle\CoreBundle\Service\AdminLogService
        arguments:    [@doctrine.orm.entity_manager]

下面是我的课:

<?php
namespace xyz\Bundle\CoreBundle\Service;
use xyz\Bundle\CoreBundle\Entity\AdminLog;

class AdminLogService
{
    protected $em;

    public function __construct(\Doctrine\ORM\EntityManager $em)
    {
        $this->em = $em;
    }

    public function logActivity($controller, $action, $entityName, $note)
    {
        $adminLog = new AdminLog(
            1,
            $controller,
            $action,
            $entityName,
            $note
        );
        $this->em->persist($adminLog);
        $this->em->flush();
    }

}

然后,我将使用以下内容从 CMS 中的任何控制器调用它:

$this->get('admin_log')->logActivity('Website', 'index', 'Test', 'Note here...');
  1. 这是最好的方法吗?
  2. 该类是否应该像我所做的那样位于捆绑包内的“服务”目录中?
  3. DependencyInjection 文件夹有什么用?

谢谢

【问题讨论】:

    标签: class symfony service dependency-injection


    【解决方案1】:

    Dependency Inction 意味着您将对象传递到类中,而不是在类中对其进行初始化。服务容器是一个类,它可以帮助您管理所有这些服务(具有依赖关系的类)。

    您的问题:

    这是最好的方法吗?

    是的,命名空间除外。

    该类是否应该像我所做的那样位于捆绑包内的“服务”目录中?

    不,它可以存在于任何命名空间中。你应该把它放在一个逻辑命名空间中,比如MyBundle\Logger

    DependencyInjection 文件夹有什么用?

    它适用于 3 种类型的类:ExtensionConfiguration 和编译器通道。

    【讨论】:

    • 服务只是放在服务容器中的普通 claasea。所以你应该把它当作普通类来处理,因此你应该把它们放在一个描述性的命名空间中
    • 好的,你能给我一个例子来确认一下吗? xyz\Bundle\CoreBundle\Logger 合适吗?
    • 抱歉,还有一件事。你会怎么称呼这个班级?只是管理员?管理员记录器?管理日志记录器? AdminLog 已用于 Entity 类。
    • 因为你在一个命名空间中,你可以只使用AdminLog。我会称它为 AdminLogger
    • 将类传递给一个类.. 不,将对象传递给一个对象 :-) 没有容器就不能拥有 DI?那绝对是垃圾!您从哪里获得这些信息?