CakePHP3でCookieを保存、呼び出し、削除の操作・CakePHP3.7対応
CakePHP3でCookieを保存、呼び出し、削除の操作
CakePHP3では Cookieの仕様が度々変更されている
システム開発において、Cookieは便利で役に立つ機能です。
ですが、CakePHP3ではその Cookieの使用方法がたびたび変更されています。
さらには、その使用方法が Cookbookなどのドキュメントへの反映されるのが遅れているようで、どうやって使えばいいのか混乱が広がっているようです。
というわけで、CakePHP3.7で Cookieを使う方法を解説します。
Cookieを使うために use句を指定
まず、Cookieを使うためには下記の use句を追加します。
use Cake\Http\Cookie\Cookie; use Cake\I18n\Time;
「use Cake\I18n\Time」の方は、Cookieの有効期限を「+1 year」のように指定するためのものです。
具体的な日時を指定する場合は必要ありません。
Cookieに値を保存する方法
Cookieに値を保存する場合は、下記のように記述します。
「key」が Cookieの変数名を指定するところで、「value」が Cookieに保存する値を指定するところです。
$this->response = $this->response->withCookie(new Cookie("key","value"));
これだけでは、ブラウザを閉じると Cookieが消えてしまいますので、Cookieの有効時間等を指定する場合は下記のように指定します。
$this->response = $this->response->withCookie(new Cookie("key","value",new Time("+1 year"),"/","example.com",false,false));
上記を分かりやすくビルダーメソッドを使用して記述する場合は以下のようになります。
$cookie = (new Cookie("key"))
->withValue("value")
->withExpiry(new Time("+1 year"))
->withPath("/")
->withDomain("example.com")
->withSecure(false)
->withHttpOnly(false);
$this->response = $this->response->withCookie($cookie);
1項目目、キーの設定
Cookieを保存するキー(変数名)を指定します。
必須項目です。
2項目目、withValue()
Cookieに保存する値を指定します。
値、項目がない場合は、該当のキーの Cookieを削除します。(保存してある Cookieを削除します。)
3項目目、withExpiry()
Cookieを保持する有効期限を指定します。
指定しない場合は、ブラウザを閉じるまでが有効期限になります。
上記のサンプルは「+1 year」を指定していますので、1年間有効になります。
同様の記述の場合は、アクセスの度に Cookieの有効期限がアクセス日時の 1年後に更新されます。
また、「2019-01-01 12:00:00」のように具体的な日時を指定することもできます。
「2019-01-01」のように時間を指定しない場合は「00:00:00」がデフォルトでセットされます。
過去日を指定した場合は、該当のキーの Cookieを削除します。(保存してある Cookieを削除します。)
4項目目、withPath()
Cookieを有効とするパスを指定します。
特定のフォルダの中でのみ Cookieが有効となるようにしたい場合は、そのフォルダを指定します。
指定しない場合のデフォルト値は「/」で、サイト全体が有効になっています。
5項目目、withDomain()
Cookieを有効とするドメインを指定します。
指定がある場合は、記述があるドメインでのみ Cookieが有効になります。
指定がない場合のデフォルト値は「””」で、ドメインに関係なく Cookieは有効になります。
ちなみに、XAMPPなどのローカル環境では「localhost」を指定します。
(「http://localhost:8080」などのポート番号付きでアクセスしている場合も「localhost」を指定します。)
6項目目、withSecure()
HTTPS接続のときのみ Cookieを扱うようにするか、しないか、を指定します。
デフォルトは「false」で、HTTPでも Cookieを利用できますが、「true」にするとセキュアな HTTPSでアクセスした場合のみ Cookieの生成、アクセスが可能になります。
7項目目、withHttpOnly()
HTTPによるアクセスのときのみアクセスができるようにするか、しないか、を指定します。
デフォルトは「false」です。「true」にすると JavaScriptから Cookieにはアクセスできなくなります。
Cookieに保存した値を取り出す方法
Cookieに保存した値を取り出す場合は、下記のように「getCookie()」を使います。
$cookieData = $this->request->getCookie("key");
echo $cookieData;
Cookieを保存する場合は「response」ですが、値を取り出す場合は「response」ではなく「request」です。
「$_SERVER」を利用して確認する方法
デバッグ時など、Cookieに保存されている情報を確認したい場合は、下記の通り「$_SERVER」を利用する方法もあります。
print_r($_SERVER["HTTP_COOKIE"]);
「$_COOKIE」を利用して確認する方法
デバッグ時など、Cookieに保存されている情報を確認したい場合は、下記の通り「$_COOKIE」を利用する方法もあります。
print_r($_COOKIE);
「response」で保存した設定情報を含めて確認する方法
下記のように、Cookieを保存したあとであれば「response」でも保存した情報を確認することはできます。
$this->response = $this->response->withCookie(new Cookie("key","value");
$cookieData = $this->response->getCookie("key");
print_r($cookieData);
Cookieを削除する方法
Cookieを削除する(保存してある Cookieを破棄する)場合は、下記の通り「withExpiredCookie()」を使用します。
$this->response = $this->response->withExpiredCookie(new Cookie("key"));
また、すでに解説したように、Cookieを削除する方法として、Cookieを設定の記述で「withValue()」の項目を記述しない、「withExpiry()」の日時を過去日にする、といった方法もあります。
Cookieの仕様を改めて思い出す
Cookieの仕様として当たり前といえば当たり前なのですが、
・1回目の処理で Cookieを保存する
・2回目の処理で Cookieを取り出す
という処理になります。
なので、1回目のアクセスで Cookieに値を保存します。
そして、2回目のアクセスで Cookieに保存した値を取り出します。
そのため、Cookieに保存した値を取り出すにはプログラムを 2回実行する必要があります。(1回のアクセスでは、Cookieに保存して、その値を取り出すことは出来ません。)
最初、これを忘れていて「あれ??」とちょっと混乱してしまったこともありましたので、改めて Cookieの仕様を思い出しておくといいかもしれません。
CakePHP3の Cookieに関する参考記事
CakePHP3 Cookbook クッキー
https://book.cakephp.org/3.0/ja/controllers/components/cookie.html
CakePHP3 Cookbook リクエストとレスポンスオブジェクト・クッキー
https://book.cakephp.org/3.0/ja/controllers/request-response.html#request-cookies
https://book.cakephp.org/3.0/ja/controllers/request-response.html#id25
CakePHP3の関連記事
CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする
CakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
その他の「CakePHP3」に関する記事一覧
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP 2.3でファイルのアップロード処理を作る
CakePHPでプラグインを使わないファイルアップロード処理を解説します。簡単です。DBにファイルを格納する方法も。
-
-
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
CakePHP4でテーブルの数値項目に対してlike句を使用した部分一致検索を実行するとエラーが発生する。クリエービルダーの不具合だと思われ対処方法が分からない。
-
-
CakePHPのFlashエラーは出るが入力項目ごとのメッセージが出ないエラーの原因
Bakeして自動生成した入力フォーム処理を元に少し処理を追加したら、入力エラーがあってもエラーメッセージが表示されなくなった。原因はリダイレクトの処理にあった。
-
-
CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法
CakePHP環境にてpostLinkで生成した削除のリンクをクリックしても処理が実行されず、JavaScriptでUncaught TypeErrorが発生。原因は同一IDを複数記述していることだった。
-
-
CakePHPを学ぶ際にはオブジェクト指向を学ぼう
CakePHPはオブジェクト指向で書かれていますので、CakePHPを学ぶにはオブジェクト指向も学びましょう。
-
-
URL短縮サービス「TTTオンライン(https://ttt.onl)」公開
URL短縮サービス「TTTオンライン(https://ttt.onl)」を公開。メールやSNSでは使いにくい長いURLを短いURLに変換するサービス。QRコードも。Google URL Shortenerが2019年3月にサービス終了。
-
-
CakePHP4 のコマンドプログラムからコンポーネントを読み込む方法解説
CakePHP4でコマンドプログラムからコンポーネントを呼び出す方法を解説。コントローラーから呼び出すときと大差はないが、use句でコンポーネントを指定する事がポイント。
-
-
CakePHP3でページごとに読み込むJavaScript、CSSを変える処理の解説
CakePHP3でJavaScriptやCSSを編集する基本形から、それらやテンプレート(エレメント)を特定のテンプレートを読み込んだときのみ編集、実行するための方法、ブロック化について解説。
-
-
CakePHP 2.3 主キー(ID)以外のキーで更新方法 updateAll
主キー(ID)以外のカラムをキーとして更新する方法、updateAllの使い方をサンプルを用いて解説します。
-
-
CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説
CakePHPのログ出力方法の解説。app.phpにログ設定をし、スコープやレベルを指定してログ出力を振り分ける方法、CakePHP4で配列出力にはvar_exportが必要なことなどを解説。