Intereting Posts
Как передать параметры из bash в php-скрипт? Нужна помощь в Regex, подстрока между двумя скобками Разделить строку на массив букв – двузначные буквы PHP Объедините два массива бок о бок, где один может быть короче другого Как сделать PDO (pdo_pgsql) для ленивой выборки строк PDO mysql: как узнать, была ли вставка успешной Если инструкция else, перенаправляемая на другую страницу Как преобразовать массив объектов в массив? Каков наилучший способ преобразования существующего PHP-класса в Java? Интеграция ZF / Doctrine2: где я могу поместить классы моделей / объектов и прокси? Как использовать PHP для получения текущего года? cURL PHP Правильный SSL между частными серверами с самозаверяющим сертификатом Как отображать содержимое одной страницы на другой странице? Уведомление и PHP + MySQL дизайн Каков наилучший способ удаления знаков препинания, символов, диакритических знаков, специальных символов?

Как создать абсолютный URL-адрес с раннего / автоматического загрузки маршрутизатора Symfony 3

Я пишу гвардии, чтобы обращаться с OAuth для моего приложения Symfony 3.

Как часть этого, в одном из моих сервисов мне нужно создать абсолютный 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 в журналы, он просто говорит localhost, хотя я обращаюсь к нему с помощью другого 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.

Мне удалось решить эту проблему, установив контекст маршрутизатора. Я уже загрузил в RequestStack доступ к IP-адресу пользователя, поэтому я использовал его для установки контекста маршрута, а затем маршрутизатор работал должным образом. Я столкнулся с проблемами, пытаясь использовать 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; } ... }