我注册了我的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);
那么依赖注入的全部目的是什么?
答案 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文档以获得更多解释。