2014-01-29 3 views
0

Я следил за кулинарной книгой Symfony о том, как переопределить контроллер пучка, но по какой-то причине я не могу заставить его работать.Как переопределить TokenController для FOSOAuthServerBundle?

My OAuth рассрочка - ребенок FOSOAuthServerBundle. Мой TokenController объявлен как класс TokenController расширяет \FOS\OAuthServerBundle\Controller\TokenController. Но по какой-то причине я все еще получаю родительский контроллер, а не мой собственный контроллер (дочерний). Когда я Alter маршрутизации вручную указать /oauth/v2/token к моему TokenController непосредственно, я получаю его выполнения, но с 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 сервера в конструктор. Поэтому, если вы переопределите конструктор, обязательно включите 'use 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»: аргумент 1 передан в OAuthTokenController :: __ construct() должен быть экземпляром OAuth2 \\ OAuth2, ни одного заданного, вызванного в app/cache/dev/classes.php в строке 2214 и не определено ». Аргумент прошедший через @ fos_oauth_server.server.Я не понимаю, почему ничего не дано. – Jocelyn

+0

Вы очистили свой кеш после обновления 'services.yml'? Служба определена в этом файле:'/vendor/friendsofsymfony/oauth-server-bundle/FOS/OAuthServerBundle/Resources/config/oauth.xml'. Это служба FOS, чтобы она существовала. – ar34z

Смежные вопросы