Не работает TrustedRedirectResponse

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

Аватар пользователя Artalek Artalek 30 сентября 2021 в 8:49

Здравствуйте, подскажите пожалуйста как быть...

Вот код:

<?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).

Лучший ответ

Аватар пользователя ivnish ivnish 30 сентября 2021 в 10:12
1

вместо $response->send(); нужно использовать return $response;

А вообще, у меня обычно ссылки на функции контроллера ведут работают через Ajax и редиректы происходят таким образом:

<?php    
$response 
= new AjaxResponse();
$url Url::fromRoute('view.registration_requests.page');
$response->addCommand(new RedirectCommand($url->toString()));
return 
$response;
?>

Комментарии

Аватар пользователя ivnish ivnish 30 сентября 2021 в 9:47
<?php
$url 
Url::fromRoute('<front>');
$response = new RedirectResponse($url->toString());
$response->send();
?>

Вместо fromRoute можно использовать fromUserInput и написать любой URL

Аватар пользователя ivnish ivnish 30 сентября 2021 в 10:03

Во-первых код покажите, а во-вторых есть разница где и как вызывать редирект. В .module файле или, например, в контроллере

Аватар пользователя Artalek Artalek 30 сентября 2021 в 10:07

в контроллере.
Пробовал и так:

<?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);
?>
Аватар пользователя ivnish ivnish 30 сентября 2021 в 10:12
1

вместо $response->send(); нужно использовать return $response;

А вообще, у меня обычно ссылки на функции контроллера ведут работают через Ajax и редиректы происходят таким образом:

<?php    
$response 
= new AjaxResponse();
$url Url::fromRoute('view.registration_requests.page');
$response->addCommand(new RedirectCommand($url->toString()));
return 
$response;
?>
Аватар пользователя Artalek Artalek 30 сентября 2021 в 10:21

ivnish wrote: вместо $response->send(); нужно использовать return $response;

Вот этот вариант сработал, спасибо.
Правда так и не понял почему TrustedRedirectResponse перестал работать, вроде как было всё норм около года

Аватар пользователя OldWarrior OldWarrior 30 сентября 2021 в 15:01
1

Artalek wrote: Правда так и не понял почему TrustedRedirectResponse перестал работать, вроде как было всё норм около года

Так есть же подсказка:

Artalek wrote: 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.

Грубо говоря, TrustedRedirectResponse использует рендер-контекст для построения метаданных кеша, отдаваемого контроллером. То есть, без метаданных результат работы контроллера будет всегда один и тот же, как бы вы ни пытались менять входные параметры. Например, редирект будет происходить на один и тот же адрес, несмотря на различные входные параметры. Это вообще-то лаг, где-то есть issue на этот счёт. В общем, рабочий каркас контроллера с TrustedRedirectResponse выглядит примерно так:

<?php
          $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 = new TrustedRedirectResponse($url->getGeneratedUrl());
          
$response->addCacheableDependency($my_param);
          return 
$response;
?>