如何在Symfony 2.6中在一个服务内部使用另一个服务

3

我在Symfony 2.6中设置了一个名为ge_lib的服务,它看起来像下面这样:

    ge_lib:
    class: GE\RestBundle\Services\GELib
    arguments: [@session, @doctrine.orm.entity_manager, @manage_ge_proc]

在GELib.php文件中,我需要使用另一个服务中的函数manage_ge_proc

    manage_ge_proc:
    class: GE\RestBundle\Services\GEManageProcedure
    arguments: [@doctrine.orm.entity_manager, @manage_ge_native_query] 

如果我尝试这样使用,它不起作用

$emailInv = $this->get('manage_ge_proc');
$sendStatus = $emailInv->pSendGeneralEmail(.....);

出现错误,说无法找到任何名称为 get 的函数。通常情况下,在任何控制器中都可以使用:$this->get('manage_ge_proc');。但是在服务中该如何使用呢?

我尝试过使用 $this->getContainer()->get('manage_ge_proc');,但它没有起作用。

1个回答

7
这个调用是从 DI 容器中获取服务,而在您的服务中却没有这个服务。
$this->get('manage_ge_proc');

它之所以在控制器中工作,是因为DI容器会自动注入它。

由于您在services.yml中有此行,这告诉Symfony将@manage_de_proc服务注入到ge_lib构造函数中。

arguments: [@session, @doctrine.orm.entity_manager, @manage_ge_proc]

您应该能够像这样从构造函数中选择@manage_ge_proc:

public function __construct(
    Session $session,
    EntityManager $entityManager, 
    GEManageProcedure $manageGeProc
)
{
    //... whatever you do in your constructor
    $this->manageGeProc = $manageGeProc;
}

这是正确的方法,确保你需要的服务被注入到其他服务中。如果你愿意,你可以注入容器并使用容器特性来使用 $this->container->get(""); 但这不是最好的解决方案。 - Andy
@svgrafov 构造函数应该像这样 - public function __construct(Session $session, EntityManager $emr),而不仅仅是变量名称作为参数吗?如果是的话,那么我是否应该将服务的类名GEManageProcedure作为参数添加进去呢?就像这样:public function __construct(Session $session, EntityManager $emr, GEManageProcedure $manageDeProc) - Manojkumar
是的,这是可能的,甚至是非常鼓励的。 - svgrafov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接