0

我注册了我的 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);

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

4

1 回答 1

1

依赖注入基本上让一个服务(在本例中为您的 UserTasksType)访问另一项服务(在本例中为您的实体管理器)。

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

这两行告诉 Symfony,当您实例化一个新的 UserTasksType 对象时,实体管理器服务将被传递到构造函数中,这有效地让您的 UserTasksType 访问实体管理器。

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

帮助您理解 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

于 2012-05-29T04:36:29.060 回答