我有一个使用Symfony2和FOSRestBundle构建的REST API。这一切都运行正常,但是在一个服务中,我将数据组合在一个不同的捆绑中的另一个服务 - 这看起来很简单,但事实并非如此。
我正在创建一个新的请求对象并添加我的参数,从那里我将请求发送到其他服务,服务接收请求很好,但是,当我尝试使用$ this->得到它给出我是好老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合作以来从未能完全理解的一个问题。
P.S。有足够积分的人可以将FOSRestBundle添加为标签吗?
谢谢!
答案 0 :(得分: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
中定义)