web-dev-qa-db-ja.com

フォーム送信ハンドラで$ response-> headers-> setCookie()を使用してCookieを設定するにはどうすればよいですか?

Deprecate user_cookie_save()and user_cookie_delete()。user_cookie_save()はDrupal 9)で非推奨となり、Symfonyのメソッド、次のコードのように。

_$response = new Response();
$response->headers->setCookie(new Cookie('foo', 'bar'));
return $response->send();
_

カスタムフォームの送信ハンドラでそのコードを使用すると、$response-send()はサイトではなく空のページを返します。ここで何が欠けていますか?

編集:

OK、それで私はクッキー設定コードをコントローラーメソッドに移動しました:

_public function setusercookies($Zip, $license){
    $destination = urldecode(\Drupal::request()->query->get('destination'));
    $response = new RedirectResponse(!empty($destination) ? $destination : '/');
    $response->headers->setCookie(new Cookie('Zip', $Zip, strtotime( '+1 year' ), '/'));
    $response->headers->setCookie(new Cookie('license', $license, strtotime( '+1 year' ), '/'));
    $response->send();
    return $response;
}
_

そして、私のフォームのsubmitForm関数で:

_$form_state->setRedirect('mycontroller.setusercookies', [
      'Zip' => $Zip,
      'license' => $license
    ], [
      'destination' => $destination
    ]);
_

ChromeとFirefoxインスペクタの両方で、Cookieが設定されていることがわかりますが、今は取得できません。両方を試しました。

_$Zip = \Drupal::request()->cookies->get('Zip', 'oops');
/* and */
$Zip = $_COOKIE['Zip'];
_

更新2:それは環境問題だと考え始めています...パンテオンレシピ付きランド。

解決済み:それがプラットフォームの問題であると思われる全体の時間:

https://pantheon.io/docs/caching-advanced-topics/#using-your-own-session-style-cookies

2
Delford Chaffin

Drupalのカスタムコードから応答を送信することはできません。コントローラーから返却する必要があります。

また、応答を設定するか、イベントサブスクライバーの既存の応答にCookieを追加することもできます。あなたのケースでは、フォーム送信で応答を設定し、次にDrupalがコアイベントサブスクライバーでこれを行います。

_$form_state->setResponse($response);
_

空のページを回避するには、おそらく応答をコンテンツで埋めるか、リダイレクト応答にCookieを追加して別のページを表示する必要があります。


しないでください$response->send()

応答を送信しない理由を説明するため。 Symfonyコンポーネントのコード例 HttpFoundation が応答を送信するのを見つけた場合、それはDrupalのカスタムコードでは無効です。このドキュメントの警告をご覧ください:

この記事では、任意のPHPアプリケーションで独立したコンポーネントとしてHttpFoundation機能を使用する方法について説明します。Symfonyアプリケーションでは、すべてが設定済みで使用できる状態です。これらの使用方法については、コントローラーの記事を参照してください。コントローラ作成時の機能。

さらにDrupalカーネルは Stack/Builder を使用してスタックミドルウェアにラップされています。たとえば、提供するミドルウェアをインストールしている場合、応答の送信はセキュリティリスクになる可能性があります。セキュリティチェック。

5
4k4