米克说的是真的。要跟进 3(覆盖服务),请继续阅读。
在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:: 调用并执行您自己的身份验证以返回令牌。
编辑
这是对上述内容的跟进。当用户收到令牌时,我必须访问一些实体并进行一些更新。这要求我有权访问实体管理器。就我而言,我必须检查 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;
}
}