Здравствуйте, подскажите пожалуйста как быть...
Вот код:
<?php
$yd = 'https://drupal.ru'; // ссылка для примера
return new TrustedRedirectResponse($yd);
?>
У меня жестко забита ссылка в переменную на внешний ресурс, и TrustedRedirectResponse стал выкидывать вот такую ошибку:
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/site/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php).
Комментарии
Задача вообще какая?
Перекинуть клиента по ссылке(переадресация)
<?php
$url = Url::fromRoute('<front>');
$response = new RedirectResponse($url->toString());
$response->send();
?>
Вместо fromRoute можно использовать fromUserInput и написать любой URL
Ошибка:
Во-первых код покажите, а во-вторых есть разница где и как вызывать редирект. В .module файле или, например, в контроллере
в контроллере.
Пробовал и так:
<?php
$link = Url::fromUserInput('https://drupal.ru')->toString()
$response = new RedirectResponse($link);
$response->send();
?>
И так:
<?php
$link = Url::fromUserInput('https://drupal.ru')->toString()
return new TrustedRedirectResponse($link);
?>
вместо $response->send(); нужно использовать return $response;
А вообще, у меня обычно ссылки на функции контроллера ведут работают через Ajax и редиректы происходят таким образом:
<?php
$response = new AjaxResponse();
$url = Url::fromRoute('view.registration_requests.page');
$response->addCommand(new RedirectCommand($url->toString()));
return $response;
?>
Вот этот вариант сработал, спасибо.
Правда так и не понял почему TrustedRedirectResponse перестал работать, вроде как было всё норм около года
Так есть же подсказка:
Грубо говоря, TrustedRedirectResponse использует рендер-контекст для построения метаданных кеша, отдаваемого контроллером. То есть, без метаданных результат работы контроллера будет всегда один и тот же, как бы вы ни пытались менять входные параметры. Например, редирект будет происходить на один и тот же адрес, несмотря на различные входные параметры. Это вообще-то лаг, где-то есть issue на этот счёт. В общем, рабочий каркас контроллера с TrustedRedirectResponse выглядит примерно так:
<?php
$response = new TrustedRedirectResponse($url->getGeneratedUrl());
$context = new RenderContext();
$url = \Drupal::service('renderer')->executeInRenderContext($context, function () use ($my_param) {
$options['absolute'] = TRUE;
$options['query'] = [
'my_param' => $my_param
];
$url = Url::fromUri('url-to-redirect', $options)->toString(TRUE);
return $url;
});
$response->addCacheableDependency($my_param);
return $response;
?>