web-dev-qa-db-ja.com

TrustedResponseRedirectの失敗-キャッシュメタデータを防ぐ方法は?

ルーティングファイルで定義されているコントローラー関数から外部サイトにリダイレクトしようとすると、次のメッセージが表示されます。

return new TrustedRedirectResponse($my_ext_url);

LogicException:コントローラーの結果は、関連するキャッシュメタデータを提供していると主張していますが、リークされたメタデータが検出されました。コンテンツのレンダリングが早すぎないことを確認してください。返されるオブジェクトクラス:Drupal\Core\Routing\TrustedRedirectResponse。 Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber-> wrapControllerExecutionInRenderContext()内(core\lib\Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber.phpの159行目)。

これは明らかにキャッシュメタデータに関連していますが、信頼できるリダイレクトでこれをどのようにオフに切り替えますか?

編集:現在、コントローラーにはコンストラクターがないため、注入は行われていません。ルーティングは次のようになります(インデントが正しいobv :):

tocyn_payment.Paypal_checkout:
path: 'test/{order_id}'
defaults:
_controller: 'Drupal\my_module\Controller\MyController::handle'
_title: 'Test Tite'
requirements:
_permission: 'access content'

前もって感謝します

マシュー

6
Mathew

URLジェネレーターについて説明しましたが、これはこれが発生する2つの方法の1つです。

要するに、あなたはこの問題で私のパッチのような何かをする必要があります: https://www.drupal.org/node/2630808

ToString()にTRUEを渡すと、キャッシュ可能な依存関係として追加する必要がある別のオブジェクトが返されます。このようなGeneratedUrlオブジェクト、エンティティオブジェクト、構成オブジェクトを使用してこれを行うことができ、応答がそれらに依存するときはいつでもそれを行う必要があります。

4
Berdir

多くの人がこれは何をすべきでないとあなたに言うかもしれませんが、エキゾチックで不可解な理由で、TrustedRedirectResponseはコントローラーに「どこか」でリークするメタデータに関するエラーをスローさせる可能性があります。私は机の周りと床の上をすべてチェックしましたが、メタデータを見つけることができませんでした:)これは、考えられるすべての方法でルートのキャッシュを無効にしても発生する可能性があります。

だから私は信頼できる応答を作成することをよく考えましたが、それを RenderContext bubble wrap でラップします。サイコロはありません。多分私の状況はエキゾチックであり、私が働いているコントローラーは私の制御下にないコードを使用しています。

したがって、Drupalは、何かを実行できないことを伝えたり、エラーが発生した場合でもリークキャッシュメタデータのデバッグに何時間もスキップしたりすることをうんざりしている場合は、独自のダン応答を作成してください..Symfonyは内部にあり、それほどボッシーではありません。私はこのメソッドをコントローラーに追加して応答を返し、そうです、外部サイトにリダイレクトできます。 RedirectResponseオブジェクトの setTargetUrl()メソッド を調べたところです。

私は少数の有限数の外部URLにリダイレクトするだけでよいことを知っているので、URL入力を無害化してホワイトリストに登録できるため、このコードを実行して信頼できるURLのリダイレクトを構築するだけです。

private function createExternalRedirectResponse($url) {
    $response = new Response('', 302, []);
    $response->targetUrl = $url;
    $response->setContent(sprintf('<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="refresh" content="0;url=%1$s" />

        <title>Redirecting to %1$s</title>
    </head>
    <body>
        Redirecting to <a href="%1$s">%1$s</a>.
    </body>
</html>', htmlspecialchars($url, ENT_QUOTES, 'UTF-8')));
    $response->headers->set('Location', $url);
    return $response;
  }
0
jackrabbithanna