Symfony2中的完全依赖注入有什么作用?

时间:2012-05-29 02:57:01

标签: dependency-injection symfony

我注册了我的services.yml文件,如下所示:

services:
  PMI.form.users_tasks:
        class: PMI\UserBundle\Form\UsersTasksType
        arguments: 
             EntityManager: "@doctrine.orm.default_entity_manager"

我可以按php app/console container:debug列出,这意味着我的服务已正确注册。

在我的UsersTasksType类中,我有以下内容:

class UsersTasksType extends AbstractType
{

    protected $ur;

    public function __construct(EntityManager  $ur )
    {
        $this->setUr($ur);
    }

    // Get and setters
}

依赖注入是否意味着我不必再将EntityManager传递给类构造函数了?或者是什么 ?

因为当我必须运行以下代码时:

$form   = $this->createForm(new UsersTasksType(), $entity);

我收到此错误:

Catchable Fatal Error: Argument 1 passed to PMI\UserBundle\Form\UsersTasksType::__construct() must be an instance of Doctrine\ORM\EntityManager, none given, called in C:\wamp\www\PMI_sf2\src\PMI\UserBundle\Controller\UsersTasksController.php on line 74 and defined in C:\wamp\www\PMI_sf2\src\PMI\UserBundle\Form\UsersTasksType.php line 19

我必须做以下事情:

$em = $this->container->get('doctrine.orm.entity_manager');
$form   = $this->createForm(new UsersTasksType($em), $entity);

那么依赖注入的全部目的是什么?

1 个答案:

答案 0 :(得分:1)

依赖注入基本上给一个服务(在这种情况下,你的UserTasksType)访问另一个服务(在这种情况下,你的实体管理器)。

arguments: 
     EntityManager: "@doctrine.orm.default_entity_manager"

这两行告诉Symfony在实例化一个新的UserTasksType对象时期望将实体管理器服务传递给构造函数,这有效地赋予了UserTasksType对实体管理器的访问权。

如果您没有在UserTasksType中使用实体管理器,则无需在构造函数中注入它,您可以删除上面的两行以及__construct() / setUr()方法在您的UserTasksType中。

帮助您了解DIC的一个更好的示例可能是您拥有专门用于发送电子邮件的服务(例如Swiftmail),您需要将其注入其他服务,以便服务可以发送电子邮件。

添加

arguments: [ @mailer ]

到您的服务定义,您的服务构造函数将期望您的邮件服务

__construct ($mailer)
{
    $this->mailer = $mailer;
}

将授予其发送电子邮件的权限

someFunction()
{
    //do something useful, then send an email using the swift mailer service
    $this->mailer->sendEmail();
}

查看最新的Symfony文档以获得更多解释。

http://symfony.com/doc/current/book/service_container.html