2015-06-03 47 views
1

關於Sf2控制器/容器,大量墨水流入。我面臨着如下的情況:Symfony2在控制器中獲得公共服務

app/console container:debug security 
... 
> 4 
[container] Information for service security.token_storage 
Service Id security.token_interface 
Class   Symfony\Component\Security\Core\Authentication\Token ... 
... 
Public  yes 

LoginBundle \ DefaultController.php

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
class DefaultController extends Controller 
{ 
    public function indexAction() 
    { 
     dump(Controller::get('security.token_storage')); 
    ... 

工程確定,很明顯。

LoginBundle \ UserUtilsController

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
class UserUtilsController extends Controller 
{ 
    public function getRoleById() 
    { 
    dump(Controller::get('security.token_storage')); 
    ... 

投:Error: Call to a member function get() on a non-object

Sf2 Book - Service container,我發現:

在這個例子中,控制器擴展的Symfony的基本控制器,它給你訪問服務容器本身。然後,您可以使用get方法從服務容器中查找並檢索my_mailer服務。

的誤解是: - 兩個控制器延伸其自身延伸ContainerAware它實現ContainerAwareInterface哪組容器基本控制器。 - 兩個控制器訪問相同的公共服務容器。

那麼,爲什麼第二個控制器它不工作?

我知道這個問題是舊的,但我不想注入控制器作爲服務,我認爲這是多餘的,錯誤的重新聲明公共服務services.yml

預先感謝您。

回答

0

我自己找到了答案,我想分享給每個人都是在相同的情況下... UserUtilsController不起作用,因爲它不以這種方式工作。 Symfony架構很有趣,如果你瞭解它。

LoginBundle \控制器\ UserUtilsController

// For this job we don't need to extends any class.. 
class UserUtilsController 
{ 
    // but we need a property for injecting the service in it 
    private $token; 

    // Now let's inject service into our property $token 
    public function __construct($token) 
    { 
    $this->token = $token; 
    } 

    // It's not done but let pretend it is and let's use it 
    public function getRoleById() 
    { 
    ... 
    return $this->token->getToken()->getRoles(); 
    ... 

services.yml

#here it's the magic 
    services: 
     # this is a new services container 
     user.loggeduser_utils: 
      # this is my class (second class) 
      class: LoginBundle\Controller\UserUtilsController 
      # this is how I feed my _construct argument 
      arguments: ["@security.token_storage"] 

所以我只是在我的新類注入現有的服務。

現在,利用這一點,我們必須在第一類調用:

LoginBundle \控制器\ DefaultController.php

class DefaultController extends Controller 
{ 
    public function indexAction() 
    { 
    // because my class is now a service container we call in this way 
    $userRoleId = $this->get('user.loggeduser_utils'); 
    ... 

上面這個解決方案几乎是微不足道的後簡單理解Sf2的DI模型。

+0

我會在兩天內接受我的回答:) –