2017-04-26 4 views
0

Symfony 3 애플리케이션의 OAuth를 처리하기 위해 경비원을 씁니다.Early/Auto loaded Symfony 3 라우터에서 절대 URL을 생성하는 방법

내 서비스 중 하나에서 Twitter에 콜백 URL로 전송할 절대 URL을 생성해야합니다.

#services.yml 
... 
app.twitter_client: 
    class: MyApiBundle\Services\TwitterClient 
    arguments: 
     - %twitter_client_id% 
     - %twitter_client_secret% 
     - connect_twitter_check 
     - '@request_stack' 
     - '@router' 
     - '@logger' 
app.twitter_authenticator: 
    class: MyApiBundle\Security\TwitterAuthenticator 
    arguments: 
     - '@app.twitter_client' 
     - '@logger' 

로거는 디버깅을위한 일시적입니다. 이 로그에 $callbackUrl를 출력 할 때

#TwitterClient.php service 
... 
use Monolog\Logger; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\HttpFoundation\RequestStack; 
use Symfony\Component\Routing\RouterInterface; 
class TwitterClient 
{ 

/** 
* TwitterClient constructor. 
* @param string   $identifier 
* @param string   $secret 
* @param string   $callbackUrl 
* @param RequestStack $requestStack 
* @param RouterInterface $router 
* @param Logger   $logger 
*/ 
public function __construct(
    string $identifier, 
    string $secret, 
    string $callbackUrl, 
    RequestStack $requestStack, 
    RouterInterface $router, 
    Logger $logger 
) { 
    $callbackUrl = $router->generate($callbackUrl, [], RouterInterface::ABSOLUTE_URL); 
    $logger->info($callbackUrl); 
    ... 
} 

그리고, 그냥 로컬 호스트 내가 다른 URL을 사용하여 접근하고, 비록 말한다.

http://localhost/connect/twitter/check 

컨트롤러에서 동일한 작업을 수행하면 올바른 전체 URL이 출력됩니다.

#TwitterController.php 
... 
use Symfony\Component\Routing\Annotation\Route; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\Routing\RouterInterface; 


class TwitterController extends Controller 
{ 
    /** 
    * @Route("/connect/twitter") 
    * @return RedirectResponse 
    */ 
    public function connectAction() 
    { 
     /** @var RouterInterface $router */ 
     $router = $this->container->get('router'); 
     $callbackUrl = $router->generate('connect_twitter_check', [], RouterInterface::ABSOLUTE_URL); 
     /** @var Logger $logger */ 
     $logger = $this->container->get('logger'); 
     $this->container->get('logger') 
      ->info($callbackUrl); 
     ... 

이 출력 :

https://dev.myapi.com:8082/app_dev.php/connect/twitter/check 

dev.myapi.com 도메인 내 호스트 파일에 설정된 포인트는 쉽게 내 로컬 응용 프로그램을 구별 할 수 있도록, localhost로도 쉽게 통합 할 수 있도록 OAuth 서비스.

답변

0

라우터 컨텍스트를 설정하여이 문제를 해결할 수있었습니다. 이미 사용자의 IP에 액세스하기 위해 RequestStack에로드 했으므로 Route의 컨텍스트를 설정하는 데 사용했으며 라우터가 예상대로 작동했습니다. problems 생성자에서 RequestStack을 사용하려고 했으므로 가능한 리팩토링하여 결국 RequestStack을 사용했습니다.

class TwitterClient 
{ 
    private $identifier; 
    private $secret; 
    private $callbackUrl; 
    private $requestStack; 
    private $router; 
    private $server; 

    /** 
    * TwitterClient constructor. 
    * 
    * @param string   $identifier 
    * @param string   $secret 
    * @param string   $callbackUrl 
    * @param RequestStack $requestStack 
    * @param RouterInterface $router 
    */ 
    public function __construct(
     string $identifier, 
     string $secret, 
     string $callbackUrl, 
     RequestStack $requestStack, 
     RouterInterface $router 
    ) { 
     $this->identifier = $identifier; 
     $this->secret = $secret; 
     $this->callbackUrl = $callbackUrl; 
     $this->requestStack = $requestStack; 
     $this->router = $router; 
    } 

    /** 
    * Wait until the last moment to create the Twitter object to make sure that the requestStack is loaded. 
    * 
    * @return \League\OAuth1\Client\Server\Twitter 
    */ 
    private function getServer() 
    { 
     if (!$this->server) { 
      $context = new RequestContext(); 
      $context->fromRequest($this->requestStack->getCurrentRequest()); 
      $this->router->setContext($context); 
      $callbackUrl = $this->router->generate($this->callbackUrl, [], RouterInterface::ABSOLUTE_URL); 
      $this->server = new Twitter(
       [ 
        'identifier' => $this->identifier, 
        'secret' => $this->secret, 
        'callback_uri' => $callbackUrl, 
       ] 
      ); 
     } 

     return $this->server; 
    } 
    ... 
}