Zend FrameworkからLaminasに移行する話(7)
はじめに
お仕事で、Zend Frameworkのバージョンアップをしなければならなくなった・・と思ったら、Zend Frameworkはもうなくて、Laminas Projectに移って新たなフレームワークとして公開されている。
いちから勉強しないといけないじゃん、ということで、必要な要件を満たせるかどうかを一歩ずつ調査していく。
要件(7)
7つ目の要件は、「セッションデータを扱うインタフェースがあること」。
Zend Frameworkで言うところのZend_Session
周り。
まぁ、なければ$_SESSION
を直に触るだけなんだけど、何かあるでしょうということで、その辺を調べていく。
導入
こちらでセットアップした環境を(コピーして)使っていく。
私は以下のようにコピーを作成。
cp -pr laminas-setup-6-join-queries laminas-setup-7-session-data cd laminas-setup-7-session-data
セッションデータを扱うためには新たなコンポーネントをインストールする必要があるので、以下のコマンドでインストールする。
composer require laminas/laminas-session
実装
新たなコントローラmodule/Application/src/Controller/SessionController.php
を以下のように作成する。
<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Session\Container; class SessionController extends AbstractActionController { public function sessionAction() { $defaultContainer = new Container(); $hogeContainer = new Container('hoge'); $hogeContainer->hogeString = 'hogehoge'; if (!isset($defaultContainer->count)) { $defaultContainer->count = 1; } else { ++$defaultContainer->count; } if (!isset($hogeContainer->num)) { $hogeContainer->num = 1; } else { $hogeContainer->num += 2; } if (!isset($hogeContainer->obj)) { $hogeContainer->obj = json_decode(json_encode(['cnt' => 1])); } else { $hogeContainer->obj->cnt++; } if (isset($defaultContainer->hogeString)) { $hoge1 = 'Default hoge string is set: ' . $defaultContainer->hogeString; } else { $hoge1 = 'Default hoge string is NOT set'; } if (isset($hogeContainer->hogeString)) { $hoge2 = 'HOGE hoge string is set: ' . $hogeContainer->hogeString; } else { $hoge2 = 'HOGE hoge string is NOT set'; } return new ViewModel([ 'count' => $defaultContainer->count, 'num' => $hogeContainer->num, 'obj' => $hogeContainer->obj, 'hoge1' => $hoge1, 'hoge2' => $hoge2, ]); } public function clearAction() { $defaultContainer = new Container(); $defaultContainer->getManager()->getStorage()->clear(); $hogeContainer = new Container('hoge'); $hogeContainer->getManager()->getStorage()->clear(); return $this->redirect()->toRoute('session', ['action' => 'session']); } }
次に、サービスマネージャの設定を更新する。module/Application/config/module.config.php
のrouter
の設定とcontrollers
の設定に以下の内容を追記する。
<?php : 'session' => [ 'type' => Segment::class, 'options' => [ 'route' => '/session[/:action]', 'defaults' => [ 'controller' => Controller\SessionController::class, 'action' => 'index', ], ], ], : 'controllers' => [ 'factories' => [ : Controller\SessionController::class => InvokableFactory::class, ], ],
最後に、ビューテンプレートmodule/Application/view/application/session/session.tpl
を以下の内容で作成する。
Count: {$count|escape:"html"} <br> Num: {$num|escape:"html"} <br> Obj: {$obj->cnt|escape:"html"} <br> Hoge1: {$hoge1|escape:"html"} <br> Hoge2: {$hoge2|escape:"html"}
動作確認
以下のURLにアクセスする。
http://192.168.56.xxx/laminas-setup-7-session-data/public/session/session
最初のアクセスでは以下のような画面が表示されればOK。
リロードするごとに、値が以下のように変わっていけばOK。
そして、以下のURLにアクセスしたときに最初の画面に戻ればOK。
http://192.168.56.xxx/laminas-setup-7-session-data/public/session/clear
まとめ
- 基本的に、Zend Frameworkと同様にセッションデータを扱うことができる
- 1回のメソッド呼び出しですべてのセッションデータを一括でクリアする方法はないんだろうか