cakephp3でセッションを利用する

2 min read読了の目安(約1800字

cakephp3でセッションへの書き込み・読み込み(+画面への表示)を行う

本記事で書いている「hoge」文字は任意の文字列です。各自置き換えて下さい。

セッションの書き込み

$hoge = 'セッション書き込み';
$this->request->session()->read('hoge', $hoge);

セッションへは文字だけではなく配列も保存できる

セッションの読み込み

$this->request->session()->read('hoge');

セッションの存在チェック

$this->request->session()->check('hoge');

セッションを利用した画面の実装例

1問1答式で、アンケートが画面に表示され、回答する機能を想定する。(Vue.jsとか使ったらもっと手軽に実装できそうではある)

設計

  1. POSTした内容をセッションに保存する
  2. セッションの中身を読み取り、画面に表示する

設計イメージ

hogeController.php
public function question(){
 //セッションに回答を記録する機能
 //セッションを読み取り回答内容を画面上に表示する機能
 //
}

セッションに回答を記録する機能の作成

hogeController.php
public function question(){
 //回答を記録する
 if($this->request->is('post')){
  $answer = $this->request->getData();//画面から質問IDと回答内容が送信される想定
  $this->request->session()->write('answer', $answer);
 }
 //回答内容を画面上に表示する
}

セッションに過去の回答を読み取り、記録する機能の作成

hogeController.php
public function question(){
 //回答を記録する
 if($this->request->is('post')){
  $answer = $this->request->getData();//画面から質問IDと回答内容が送信される想定
  $this->request->session()->write('answer', $answer);
 }
 //回答内容を画面上に表示する
 $answers = $this->request->session()->read('answer');
 $this->set(compact('answers'));
}

セッションが登録されていないときは空の配列を画面に送る。

上記のままだと、画面でforeach等のループ処理時にエラーとなる場面がある($answersがnullのとき

hogeController.php
public function question(){
 //回答を記録する
 if($this->request->is('post')){
  $answer = $this->request->getData();//画面から質問IDと回答内容が送信される想定
  $this->request->session()->write('answer', $answer);
 }
 //回答内容を画面上に表示する
 $session = $this->request->session();//コードが冗長になるため変数に入れる
 $answers = $session->check('answer') ? $session->read('answer'): [];
 $this->set(compact('answers'));
}

コントローラーが完成。あとは変数に入れているanswersを画面上で読み取り表示してあげると良い。(個人的には、配列をそのまま送るのではなく、Entity化しておくと使いやすい。)

余談

上記のままだと、画面更新やリロードによって二重送信が発生する。
その解決策として、postRedirectGet(PRG)という手法があるが、本筋ではないため割愛。