从服务中呼叫服务?

时间:2012-10-30 00:41:52

标签: php symfony

我试图调用从另一个服务调用ANOTHER方法的服务中的方法。

当前课程 - >不同的课程/服务 - >到不同的班级/服务

我可以成功调用初始服务,但是当该服务尝试调用其他服务时,我会收到错误

Fatal error</b>:  Call to a member function get() on a non-object

导致错误的代码:

$edmt = $this->get('endorsements');

服务声明:

endorsements:
    class:        EndorseMe\EndorsementBundle\Controller\DefaultController
    arguments: [ @router, @service_container]

然而,为了使事情更棘手,这项服务并不总是用作服务。它也是常规的symfony控制器。它需要能够双向工作

2 个答案:

答案 0 :(得分:3)

您应该将第二项服务作为参数传递给您的第一项服务:

endorsements:
    class:     EndorseMe\EndorsementBundle\Controller\DefaultController
    arguments: [ @router, @service_container, @your_second_service ]

然后在你的第一次服务中:

protected $injectedService;

public function __construct(SecondServiceClass $injectedService)
{
    $this->injectedService = $injectedService;
}

之后,您应该可以通过调用$this->injectedService

来使用注入的服务

请查看文档中的Referencing Services章节。

编辑:我认为不可能将同一个类用作服务和控制器。我建议改为define Controller as Service。最后,您将在第一个服务中注入第二个服务,并在控制器服务中注入您的第一个服务(总共三个服务)。

答案 1 :(得分:0)

自2017年起和Symfony 3.3 ,这变得非常简单。

1。使用自动装配注册服务

# app/config/services.yml
services:
    _defaults:
        autowire: true

    EndorseMe\EndorsementBundle\:
        resource: ../../src/EndorseMe/EndorsementBundle

2。通过构造函数注入

在任何其他服务中需要任何服务
<?php

namespace EndorseMe\EndorsementBundle;

class MyService
{
    /**
     * @var AnotherService 
     */
    private $anotherService;

    public function __construct(AnotherService $anotherService)
    {
        $this->anotherService = $anotherService;
    }

    public function someMethod()
    {
        $this->anotherService->someAnotherMethod();
    }
}

这就是全部!

just check this post之前/之后获取更多Symfony 3.3依赖注入新闻示例。