またどこかでCTOっぽいことやってる人のブログ

フリーランスを経て、またどこかでCTOっぽいことをやってる人が書いてます。何か色々やってます。

CakePHP3でドキュメントの有効期限切れに対応してみた。

CakePHP3に限った話ではないのですが。
例えばブラウザバックした際に「ドキュメントの有効期限切れ」とかいうエラーが出て、頭がイーッとすることがあります。
これの対応です。


発生する理由はPHPの初期設定だと、headerに「no-cashe」を送っているからです。
ですので、そこをごにょごにょすると対応完了できます。
今回はCakePHP3のプロジェクトから、その設定をする方法になります。


上で書いていますがheaderに送ってあげればそれで終わる話です。
あとは送るタイミングの話。
CakePHP3だとbeforeRender辺りで実行するといいと思います。
AppController.phpを開いて、該当箇所に埋め込みます。

<?php
 public function beforeRender(Event $event) {
  // バージョンによりますが、ここは最初から記載があると思います
  if (!array_key_exists('_serialize', $this->viewVars) &&
   in_array($this->response->type(), ['application/json', 'application/xml'])) {
    $this->set('_serialize', true);
   }
  }

  // 2017/06/22 パクり元のエンジニアから訂正が入ったのでここから修正
  // ドキュメントの有効期限切れ対応として、以下を追加します
  header("Cache-Control: no-cache, no-store, must-revalidate");
  header("Pragma: no-cache");
  // ここまで修正しました
 }

もし、ControllerやAction毎に切り分けたくなったら、AppControllerにprotectedでbool型の変数でも作成して上記の箇所にtrueの場合のみ実行するように修正。
あとはControllerなどで作成した変数をfalseに変えればいいかと思います。


今回は弊社エンジニアが作ってた処理をそのまま記事にしてみました。
すいません。今日もパクリです。