Symfony2依赖注入/服务容器

时间:2013-05-15 16:51:45

标签: class symfony service dependency-injection

我是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. 什么是?
  4. 的DependencyInjection文件夹

    由于

1 个答案:

答案 0 :(得分:3)

依赖关系意味着您将对象传递给类,而不是在类中初始化它。 Service Container是一个可以帮助您管理所有这些服务(具有依赖项的类)的类。

您的问题:

  

这是最好的方法吗?

是的,除了名称空间。

  

该类是否应该像我一样在捆绑包内的“服务”目录中?

不,它可以存在于任何命名空间中。您应该将其放在逻辑命名空间中,例如MyBundle\Logger

  

什么是DependencyInjection文件夹?

它适用于3种类型:ExtensionConfiguration和编译器传递。