Не работает TrustedRedirectResponse

Главные вкладки

Аватар пользователя Artalek Artalek 11 ноября 2020 в 8:53

Здравствуйте, мне нужно перенаправить клиента на другой сайт,
вот такая ошибка из-за использования TrustedRedirectResponse.
Я понял из-за чего ошибка, но не знаю почему так происходит.
Ошибка из-за "\Drupal::url".
Перед использованием TrustedRedirectResponse, я формирую ссылку, вот так:

<?php
$url 
'http://' $_SERVER['HTTP_HOST'] . \Drupal::url('mymodule.lk', ['page' => 'pay']);
?>

и из-за этого ошибка.

Это backurl, он мне нужен, для получения ссылку по которому после необходимо перенаправить клиента

Лучший ответ

Аватар пользователя Sky Cat Sky Cat 11 ноября 2020 в 21:30
1

Кому лень читать:

<?php Url::fromRoute('mymodule.lk', ['page' => 'pay'])->toString(TRUE);?>

В аргументе функции toString() ставим TRUE. Но информацию по ссылке выше лучше прочитать, конечно.

Комментарии

Аватар пользователя vlucas vlucas 11 ноября 2020 в 8:57

Блин, я что-то запутался. вы на заглушке протестировали TrustedRedirectResponse?
и не работает?

Или всё таки вопрос в том, что представленная вами конструкция не работает, т.е. не формирует ссылку?

Аватар пользователя Artalek Artalek 11 ноября 2020 в 9:01

я пробовал вот так:

<?php
return new TrustedRedirectResponse('http://example.com/foo/bar/');
?>

если использовать перед "\Drupal::url('mymodule.lk', ['page' => 'pay'])", то работает, а вот после - нет

Аватар пользователя Artalek Artalek 11 ноября 2020 в 9:04

Да

<?php
mymodule
.lk:
  
path'/lk/{page}'
  
defaults:
    
_title'LK'
    
_controller'\Drupal\mymodule\Controller\LKController::content'
  
requirements:
    
_permission'access content'
  
options:
    
no_cache'TRUE'
?>
Аватар пользователя vlucas vlucas 11 ноября 2020 в 9:07

а теперь включаем xdebug и смотрим что возвращает метод \Drupal\mymodule\Controller\LKController::content

Он должен вернуть строку, чтобы ваш код работал

Аватар пользователя Artalek Artalek 11 ноября 2020 в 9:09

Он возвращает страницу, там формируются данные и через template twig возвращает страницу.
А какая разница, что он возвращает? \Drupal::url разве не должен просто вернуть ссылку на данную страницу?

Аватар пользователя vlucas vlucas 11 ноября 2020 в 9:57

а вся цепочка:
'http://' . $_SERVER['HTTP_HOST'] . \Drupal::url('mymodule.lk', ['page' => 'pay']);
т.е. ваш $url

var_dump

и поставьте хотя бы devel

Аватар пользователя vlucas vlucas 11 ноября 2020 в 10:02

вроде был

/lk/pay

и точно ли ссылка будет на внешний ресурс???

А для чего devel?

Если не юзаете xdebug, то хотя бы будете отлаживать не так дико как var_dump

Аватар пользователя Artalek Artalek 11 ноября 2020 в 9:02
LogicException: The controller result claims to be providing relevant cache metadata, but leaked metadata was detected. Please ensure you are not rendering content too early. Returned object class: Drupal\Core\Routing\TrustedRedirectResponse. in Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->wrapControllerExecutionInRenderContext() (line 154 of /var/www/demo/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php).
Аватар пользователя Artalek Artalek 11 ноября 2020 в 10:07

я в TrustedRedirectResponse вставляю не $url, а другую переменную с ссылкой.
Пока что я тестирую с данной ссылкой:

<?php
return new TrustedRedirectResponse('http://example.com/foo/bar/');
?>
Аватар пользователя vlucas vlucas 11 ноября 2020 в 10:09

если работает так, и если ваша переменная - строка - ссылка на внешний ресурс - то и она будет работать.
Если не работает - смотрите что в переменной, значит что-то в ней не верно

Аватар пользователя Artalek Artalek 11 ноября 2020 в 10:17

Если перед данным кодом:

<?php
$ur 
= \Drupal::url('mymodule.lk', ['page' => 'pay']);
?>

TrustedRedirectResponse работает и перенаправляет, а после данной строчки нет, это значит проблема в данной строке, где используется \Drupal::url, в чем еще может быть проблема?

Аватар пользователя Artalek Artalek 11 ноября 2020 в 10:13

Я предоставил весь код, который необходим, предоставлять прям весь код не за чем, я думаю это неправильно.

Аватар пользователя gun_dose gun_dose 11 ноября 2020 в 10:25

\Drupal::url - устаревший метод. Непонятно, кто вас надоумел его использовать. По-нормальному это делается так:

<?php
$url 
= \Drupal\Core\Url::fromRoute('mymodule.lk', ['page' => 'pay'])->toString();
?>

Если бы вы читали документацию по тем методам и классам, которые пытаетесь использовать, таких проблем бы не было.

Аватар пользователя gun_dose gun_dose 11 ноября 2020 в 10:56

Проблема ошибки может быть в том, что при генерации урл собираются какие-то метаданные для кэша и такие операции нужно выполнять внутри executeInRenderContext. Как вариант, избежать этого можно, если просто сформировать урл, как строку.

Аватар пользователя Sky Cat Sky Cat 11 ноября 2020 в 21:30
1

Кому лень читать:

<?php Url::fromRoute('mymodule.lk', ['page' => 'pay'])->toString(TRUE);?>

В аргументе функции toString() ставим TRUE. Но информацию по ссылке выше лучше прочитать, конечно.