Qbilinux 日記

Linux に関係することだけではなく,最近は一般的なコンピュータやガジェット関係についても記載してます.

cakephp 3.5.x 用に Cookie まわりを書き換えてるけどうまく動作しないなぁ

もう一件,ここ数日悩んでいることを.

某所でも同じことを書いたので,同じ内容を目にする方はご容赦を.

過去,cakephp 3.5.x の cookie 回りでエラーになる件って書来ましたけど,遅ればせながら時間をつくって 3.5.x 系の cookie の実装を試してみました.けど,なんだかうまく動作しない.

toshi-mtk.hatenablog.com

手元のコートでは cookie の作成,削除なんかをしていたんだけど,そのコードを書き換えてみたけど削除がうまく動作しない.

ちょっと詳細がわからないので先送りかなぁ,それとも,Cookie を削除しなくてもいいように仕様変更するか,それとももう少し試行錯誤するか...とちょっと思案中.

一応,やったことを.

3.5.x 系から cookie を暗号化するためのミドルウエアが追加されているので,その対応をしました.詳細は Cookbook に書かれていますが,https://github.com/cakephp/app あたりから webroot/index.php, src/Application.php をとってくる感じ.それらのファイル中で呼び出されるファイルなども手元に無い場合には持ってくる or 使わない仕様に修正する必要があります.あ,当然,暗号化が必要なければミドルウエアを追加する必要はないです.

持ってきた src/Application.php の中でミドルウエアの設定などを行います.ドキュメントのとおり EncryptedCookieMiddleware を new して $middlewareQueue に登録する感じですね.

use Cake\Http\Middleware\EncryptedCookieMiddleware;

$cookies = new EncryptedCookieMiddleware(
    // Names of cookies to protect
    ['secrets', 'protected'],
    Configure::read('Security.cookieKey')
);

$middlewareQueue->add($cookies);

あ,Configure::read('Security.cookieKey') してるので,この辺りの変数設定も app.php 中に追加が必要かな.

次に,実際の Cookie 回りでの変更ですが,CookieCollection クラス, Cookie クラスに分離されたみたいなのでその形に修正.

実装としては

use Cake\Http\Cookie\Cookie;
use Cake\Http\Cookie\CookieCollection;

$cookes = $this->response->getCookieCollection();

で CookieCollection を呼び出して,

if ($cookies->has('hoge')) { ... }

とかで cookie の有無のチェックして

$cookies->get('hoge')->getValue()

で実際の値の読み出しかな.

追加は

$cookie = new Cookie(
    'sample_mode', // name
    'test', // value
    new \DateTime('30 day'), // expiration time, if applicable
    '/', // path, if applicable
    'hoge.com', // domain, if applicable
    false, // secure only?
    true // http only ?
);
$this->response = $this->response->withCookie($cookie);

な感じ.DateTime の前に \ を書いてあるのは一応エラーになるのを防ぐため.

削除は...

$cookies->remove('hoge');

って記述がマニュアルにあったけど,試してみると CookieCollection からは削除されるけど,実際の Cookie データは削除されないですね.

CookieCollection は不変ってことで,このデータを操作しても実体は変わらない仕様っぽい.Response とか Request まわりで実際に削除する作業が必要みたいだけど,あまり時間がとれてないので詳細を調べきれていません._o_

って感じで今のとことは削除する方法がちょっと不明って感じ.

削除するってインプリはほとんどされないのかな?でも,これまでは

$this->Cookie->delete('hoge');

だけで削除できたのにな.単に,私がわかってないだけかもしれないですけど.

本当は全部の書き方がクリアになってからこの記事をアップしようかと思っていましたけど,まぁ,そんな感じで試行錯誤してますってことで,途中ですけど書いてみました.cakephp 3.5.x 系の Cookie 回りの情報があまりないので,少しは参考になるかも知れないなと思ったのもちょっとあります.はい.:-)

削除の件が解決したら,結果は一応書くつもりです.けど,時間が.....

CakePHP3 ビギナーズガイド: 最新のPHPフレームワークをマスターせよ! PRIMERシリーズ (libroブックス)
掌田津耶乃
Tuyano-Project