2014-01-29 70 views
0

我跟着Symfony的食譜如何重寫包控制器,但由於某種原因,我無法得到它的工作。如何覆蓋FOSOAuthServerBundle的TokenController?

我的OAuth包是FOSOAuthServerBundle的孩子。我的TokenController被聲明爲類TokenController延伸\FOS\OAuthServerBundle\Controller\TokenController。但由於某種原因,我仍然得到父控制器執行,而不是我自己的控制器(孩子)。當我改變手動路由指向/oauth/v2/tokenTokenController直接,我把它執行,但有一個500錯誤:

Argument 1 passed to FOS\OAuthServerBundle\Controller\TokenController::__construct() must be an instance of OAuth2\OAuth2, none given, called in /.../vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/ControllerResolver.php on line 78 and defined (500 Internal Server Error)

爲什麼?我感到困惑。怎麼了?任何幫助將不勝感激。謝謝。

回答

1

的一點想法:

你申報你的AppKernel.php捆綁?

$bundles = array(
     ... 
     new Acme\OAuthServerBundle() 
    ); 

正如你在oauth.xml並在Controller class看到,控制器期望在其構造服務器的OAuth2。因此,如果您重寫構造函數,請確保包含'使用OAuth2 \ OAuth2;'在文件的頂部。

由於控制器作爲一個服務,你可能需要重寫oauth.xml重新定義類中使用該服務。

+0

如何覆蓋oauth.xml? – Jeboy

+0

請參閱[如何覆蓋包的任何部分](http://symfony.com/doc/current/cookbook/bundles/override.html) – Mick

2

米克說的是真的。要跟進(重寫服務),請繼續閱讀。

app/config/services.yml,添加以下內容:

services: 
    fos_oauth_server.controller.token: 
     class: OAuth2Bundle\Controller\TokenController 
     arguments: [@fos_oauth_server.server] 

哪裏OAuth2Bundle\Controller\TokenController是擴大從FOS束的一個自定義控制器。

例如:

namespace OAuth2Bundle\Controller; 

use FOS\OAuthServerBundle\Controller\TokenController as BaseController; 
use OAuth2\OAuth2; 
use Symfony\Component\HttpFoundation\Request; 

class TokenController extends BaseController { 

    public function tokenAction(Request $request) 
    { 
     // Do whatever you like here 

     $result = parent::tokenAction($request); 

     // More custom code. 

     return $result; 
    } 
} 

當然,你可以做任何你喜歡的$result。您甚至可以省略parent::調用並執行您自己的身份驗證來返回令牌。

EDIT

這是上述的後續。我必須訪問一些實體並在用戶收到令牌時進行一些更新。這要求我有權訪問實體管理器。在我的情況下,我必須檢查OAuth客戶端是否仍處於活動狀態;它不會被刪除,但只是暫時禁用來阻止一組用戶。

因爲控制器是一種服務,你可以添加額外的參數,如實體管理器:

服務定義現在看起來是這樣的:

fos_oauth_server.controller.token: 
    class: ApiBundle\Controller\OAuth\TokenController 
    arguments: [@fos_oauth_server.server, @doctrine.orm.entity_manager] 

當然控制器現在有一個構造函數。它現在看起來像這樣:

namespace OAuth2Bundle\Controller; 

use Doctrine\ORM\EntityManager; 
use FOS\OAuthServerBundle\Controller\TokenController as BaseController; 
use OAuth2\OAuth2; 
use Symfony\Component\HttpFoundation\Request; 

class TokenController extends BaseController { 

    /** 
    * @var EntityManager 
    */ 
    private $em; 

    /** 
    * @param OAuth2 $server 
    */ 
    public function __construct(OAuth2 $server, EntityManager $entityManager) 
    { 
     parent::__construct($server); 
     $this->em = $entityManager; 
    } 

    public function tokenAction(Request $request) 
    { 
     // Do whatever you like here 

     $result = parent::tokenAction($request); 

     // More custom code. 

     return $result; 
    } 
} 
+0

謝謝!有效 ! –

+0

使用您的「EDIT」部分:傳遞給OAuthTokenController :: __ construct()的參數1必須是OAuth2 \\ OAuth2的實例,沒有給出,在第2214行的app/cache/dev/classes.php中調用,並定義爲「。傳遞的是@ fos_oauth_server.server。我不明白爲什麼沒有給出。 – Jocelyn

+0

你在更新'services.yml'後是否清除了緩存?服務在這個文件中定義:'/ vendor/friendsofsymfony/oauth-server-bundle/FOS/OAuthServerBundle/Resources/config/oauth.xml'這是一個FOS服務,所以它應該存在。 – ar34z