2017-04-26 1 views
0

私はSymfony 3アプリケーションのOAuthを扱うガードを書いています。アーリー/オートロードされたSymfony 3ルータから絶対URLを生成する方法

私のサービスの1つでは、コールバックURLとしてTwitterに送信する絶対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' 

ロガーはデバッグ用に一時的です。

#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); 
    ... 
} 

とするとき、それはログに$callbackUrlを出力し、それだけで私は別のURLを使用してアクセスしていますにもかかわらず、localhostを言います。

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ドメインは私のhostsファイルに設定され、ポイントはそれが簡単に自分のローカルアプリを区別するために作るために、localhostにしても、それが簡単に統合できるようにすることOAuthサービス。

答えて

0

私はルータコンテキストを設定することでこれを解決することができました。 私はすでにRequestStackにロードしてユーザーのIPにアクセスしていますので、これを使用して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; 
    } 
    ... 
} 
関連する問題