HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

Zend FrameworkからLaminasに移行する話(7)

はじめに

お仕事で、Zend Frameworkのバージョンアップをしなければならなくなった・・と思ったら、Zend Frameworkはもうなくて、Laminas Projectに移って新たなフレームワークとして公開されている。

いちから勉強しないといけないじゃん、ということで、必要な要件を満たせるかどうかを一歩ずつ調査していく。

要件(7)

7つ目の要件は、「セッションデータを扱うインタフェースがあること」。

Zend Frameworkで言うところのZend_Session周り。 まぁ、なければ$_SESSIONを直に触るだけなんだけど、何かあるでしょうということで、その辺を調べていく。

導入

こちらでセットアップした環境を(コピーして)使っていく。

hhelibex.hatenablog.jp

私は以下のようにコピーを作成。

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.phprouterの設定と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。

laminas-setup-7-session-data-1

リロードするごとに、値が以下のように変わっていけばOK。

laminas-setup-7-session-data-2

そして、以下のURLにアクセスしたときに最初の画面に戻ればOK。

http://192.168.56.xxx/laminas-setup-7-session-data/public/session/clear

まとめ

  • 基本的に、Zend Frameworkと同様にセッションデータを扱うことができる
  • 1回のメソッド呼び出しですべてのセッションデータを一括でクリアする方法はないんだろうか