1

我有一个用 Symfony2 和 FOSRestBundle 构建的 REST API。这一切都很好,但是在一个服务中,我将来自另一个服务的数据组合在不同的捆绑包中——这看起来很简单,但事实并非如此。

我正在创建一个新的请求对象并添加我的参数,从那里我向另一个服务发出请求,服务接收到请求很好,但是,当我尝试使用 $this->get 它给了我很好的旧Call to a member function get() on a non-object in ...

我知道我缺少服务容器(我不完全理解为什么当我调用第一个包而不是第二个包时它可用),这一切都很好,但是我如何注入它或它的一个组件所以我可以使用$this->get在 services.yml 中定义的自定义服务吗?(很容易通过他们使用的服务容器arguments: container: "@service_container"

将此捆绑包设置为服务将不起作用,因为 FOSRestBundle 不会将其称为服务。

简而言之:我希望能够在 bundle1 中通过执行从 bundle2 获取数据

namespace MyVendor\Bundle1\Controller

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;  
use MyVendor\Bundle2\Controller\Bundle2ClassName;

class Bundle1 {

    //if i wanted to do this here it would work fine:
    // $this->get('my.service.defined.in.service.yml');

    $bundle2 = new Bundle2ClassName();
    $returned_data = $bundle2->myFunction();
}

然后,一旦进入 bundle2 中的 myFunction,如果我尝试调用完全相同的服务函数,我就会得到可怕的 get 错误。如果我直接通过 FOSRest 路由调用 bundle2,我显然没有这个问题。

namespace MyVendor\Bundle2\Controller

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;  

class Bundle2 {

    //this does not work
    $this->get('my.service.defined.in.service.yml');

    //do some stuff then return response
    return($response);

}     

我一遍又一遍地阅读了所有服务容器文档,所以如果你要链接到它们,如果你能指出它解释如何处理这些东西的确切部分,我将不胜感激。这是我几个月前开始使用 Symfony 以来一直无法完全理解的一个问题。

PS 有足够积分的人可以将 FOSRestBundle 添加为标签吗?

谢谢!

4

1 回答 1

2

首先,您应该使用$this->forward将请求转发到另一个控制器。

其次,您无法访问第二个控制器中的服务容器的原因可能是因为您正在尝试手动初始化它 -除非您绝对知道自己在做什么,否则永远不要这样做(具体来说,您忘记将服务容器传递为控制器依赖)。

第三,作为一个关于事情如何工作的例子——你原来的控制器对服务容器的依赖是由同一个容器处理的,并ContainerAware在那个控制器初始化setContainer()时调用了扩展,你很可能在手动初始化第二个控制器时忘记了这样做。所以为了让它工作(我再次强烈建议不要这样做),你应该这样做:

class Bundle1 {

    //if i wanted to do this here it would work fine:
    // $this->get('my.service.defined.in.service.yml');

    $bundle2 = new Bundle2ClassName();
    $bundle2->setContainer($this->container);
    $returned_data = $bundle2->myFunction(); 
}

您收到$this->get() on a non-object...错误的原因是因为$this->get()在您的控制器中实际上是一个快捷方式$this->container->get()(在 中定义Symfony\Bundle\FrameworkBundle\Controller\Controller

于 2012-06-22T05:41:20.957 回答