[英]Using 'forward' with FOSOAuthServerBundle TokenController
[英]How to override TokenController for FOSOAuthServerBundle?
我遵循了Symfony的食谱,了解如何覆盖捆绑控制器,但是由于某种原因,我无法使其正常运行。
我的OAuth
捆绑包是FOSOAuthServerBundle
的子FOSOAuthServerBundle
。 我的TokenController
被声明为TokenController类扩展\\FOS\\OAuthServerBundle\\Controller\\TokenController
。 但是由于某种原因,我仍然要执行父控制器,而不是自己的控制器(子控制器)。 当我手动更改路由以将/oauth/v2/token
直接指向我的TokenController
,我将其执行,但出现500错误:
传递给FOS \\ OAuthServerBundle \\ Controller \\ TokenController :: __ construct()的参数1必须是OAuth2 \\ OAuth2的实例,没有给出,在/.../vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller中调用/ControllerResolver.php在第78行并已定义(500内部服务器错误)
为什么? 我很困惑。 怎么了? 任何帮助将不胜感激。 谢谢。
米克说的是真的。 要跟进3 (覆盖服务),请继续阅读。
在app/config/services.yml
,添加以下内容:
services:
fos_oauth_server.controller.token:
class: OAuth2Bundle\Controller\TokenController
arguments: [@fos_oauth_server.server]
其中OAuth2Bundle\\Controller\\TokenController
是您的自定义控制器,是从FOS捆绑包中扩展OAuth2Bundle\\Controller\\TokenController
。
例如:
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::
并执行自己的身份验证以返回令牌。
编辑
这是上面的后续内容。 当用户收到令牌时,我必须访问一些实体并进行一些更新。 这要求我有权访问实体管理器。 就我而言,我必须检查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;
}
}
一些想法:
1您是否在AppKernel.php
声明了包?
$bundles = array(
...
new Acme\OAuthServerBundle()
);
2如在oauth.xml和Controller类中所见 ,控制器期望服务器OAuth2在其构造函数中。 因此,如果您覆盖了构造函数,请确保包含“ use OAuth2 \\ OAuth2;” 在文件的顶部。
3由于控制器用作服务,因此您可能必须重写oauth.xml
以重新定义用于该服务的类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.