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
Drupalのカスタムコードから応答を送信することはできません。コントローラーから返却する必要があります。
また、応答を設定するか、イベントサブスクライバーの既存の応答にCookieを追加することもできます。あなたのケースでは、フォーム送信で応答を設定し、次にDrupalがコアイベントサブスクライバーでこれを行います。
_$form_state->setResponse($response);
_
空のページを回避するには、おそらく応答をコンテンツで埋めるか、リダイレクト応答にCookieを追加して別のページを表示する必要があります。
しないでください$response->send()
応答を送信しない理由を説明するため。 Symfonyコンポーネントのコード例 HttpFoundation が応答を送信するのを見つけた場合、それはDrupalのカスタムコードでは無効です。このドキュメントの警告をご覧ください:
この記事では、任意のPHPアプリケーションで独立したコンポーネントとしてHttpFoundation機能を使用する方法について説明します。Symfonyアプリケーションでは、すべてが設定済みで使用できる状態です。これらの使用方法については、コントローラーの記事を参照してください。コントローラ作成時の機能。
さらにDrupalカーネルは Stack/Builder を使用してスタックミドルウェアにラップされています。たとえば、提供するミドルウェアをインストールしている場合、応答の送信はセキュリティリスクになる可能性があります。セキュリティチェック。