🔥
cakephp3でセッションを利用する
cakephp3でセッションへの書き込み・読み込み(+画面への表示)を行う
本記事で書いている「hoge」文字は任意の文字列です。各自置き換えて下さい。
セッションの書き込み
$hoge = 'セッション書き込み';
$this->request->session()->read('hoge', $hoge);
セッションへは文字だけではなく配列も保存できる
セッションの読み込み
$this->request->session()->read('hoge');
セッションの存在チェック
$this->request->session()->check('hoge');
セッションを利用した画面の実装例
1問1答式で、アンケートが画面に表示され、回答する機能を想定する。(Vue.jsとか使ったらもっと手軽に実装できそうではある)
設計
- POSTした内容をセッションに保存する
- セッションの中身を読み取り、画面に表示する
設計イメージ
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)という手法があるが、本筋ではないため割愛。
Discussion