Я использую Symfony2 OAuth Bundle для аутентификации пользователей в моем веб-сервисе. Все работает правильно, но теперь я заинтересован в расширении полей JSon, где включен токен. Для этого я хочу создать свой собственный TokenController, который расширяет OAuth Bundle TokenController. Но каждый раз, когда я получаю эту ошибку:
Catchable Fatal Error: аргумент 1 передан в DAL\WebServiceBundle\Controller\TokenController :: __ construct() должен быть экземпляром OAuth2\OAuth2, не указанным, вызываемым в C:\xampp\htdocs\DALService\app\cache\dev\classes.php в строке 2396 и определен в C:\xampp\htdocs\DALService\src\DAL\WebServiceBundle\Controller\TokenController.php строка 22
Это мой код TokenController:
<?php
namespace DAL\WebServiceBundle\Controller;
use Symfony\Component\HttpFoundation\Request;
use OAuth2\OAuth2;
use OAuth2\OAuth2ServerException;
use FOS\OAuthServerBundle\Controller\TokenController as BaseTokenController;
class TokenController extends BaseTokenController
{
public function tokenAction (Request $request)
{
$response = parent::tokenAction($request);
return $response;
}
}
Любая идея о том, что происходит?
Благодарю!
Чтобы расширить TokenController, вы можете преодолеть его с помощью компилятора.
public function process(ContainerBuilder $container)
{
$tokenControllerService = $container->getDefinition('fos_oauth_server.controller.token');
$tokenControllerService->setClass('YourTokenController');
}
У меня была именно эта проблема, я попытался все это и не имел никакой разницы, просто не дал бы мне ввести службу fos_oauth_server.server!
Но то, что вы можете сделать, это расширить класс контроллера по умолчанию вместо контроллера токена, а затем получить файл fos_oauth_server.server из контейнера службы. Это не идеальное решение imo, и я бы предпочел найти способ, который может расширить класс TokenController fosoauth, но он работает
namespace Acme\ApiBundle\Controller
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
class TokenController extends Controller{
public function tokenAction(Request $request)
{
$server = $this->get('fos_oauth_server.server');
try {
return $server->grantAccessToken($request);
} catch (OAuth2ServerException $e) {
return $e->getHttpResponse();
}
}
}
Прочтите следующее: как определить контроллеры как службы и добавить их в ваши services.xml/yml
Почему fos_oauth_server.server?
Потому что расширенный конструктор контроллера требует его работы!
<service id="dal.webservice.bundle.controller.token" class="DAL\WebServiceBundle\Controller\TokenController">
<argument type="service" id="fos_oauth_server.server" />
</service>
dal.webservice.bundle.controller.token:
class: DAL\WebServiceBundle\Controller\TokenController
arguments:
server: @fos_oauth_server.server
public function __construct(OAuth2 $server) { parent::__construct($server); }
Your TokenController public function __construct(OAuth2 $server) { parent::__construct($server); }
В your services.yml/xml вы должны определить параметры конструктора. your.service: class: DAL\WebServiceBundle\Controller\TokenController arguments: doctrine: @doctrine//example OFC tags: - { name: some tag... }
И вот как определить контроллер как службу http ://symfony.com/doc/current/cookbook/controller/service.html