2012-06-22 47 views
1

我有一個使用Symfony2和FOSRestBundle構建的REST API。這一切都很好,但是在一個服務中,我將數據從另一個服務組合到另一個服務中 - 這看起來很簡單,但事實並非如此。

我正在創建一個新的請求對象並添加了我的參數,從那裏我將請求發送到其他服務,但服務收到請求罰款,但是,當我嘗試使用$ this-> get it我好老Call to a member function get() on a non-object in ...

我知道我錯過了服務容器(我不完全明白爲什麼它可用時,我打電話打第一捆但不是第二),這一切都很好,但如何做我注入它或它的一個組件,所以我可以使用$this->get來打我在services.yml中定義的自定義服務? (易於使用arguments: container: "@service_container"將它們傳遞給服務容器)

將此捆綁包設置爲服務將不起作用,因爲FOSRestBundle不會將其稱爲服務。

在短:我希望能夠通過在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(); 
} 

然後,一旦內部myFunction的從bundle2中獲取數據時,裏面bundle1如果我嘗試調用完全一樣的服務功能,我得到了可怕的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添加爲標籤嗎?

謝謝!

回答

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

+0

謝謝! $ this->向前完美!我可以通過執行'\t $ bundle2_stuff = $ this-> forward('MyVendorBundle2Bundle:Bundle2:myFunction',array('request'=> $ request))來傳遞請求對象;'' – greg