HHeLiBeXの日記 正道編

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

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

はじめに

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

そこで、次の候補としてLaravelを挙げて、必要な要件を満たせるかどうかを一歩ずつ調査していく。

要件(7)

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

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

導入

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

hhelibex.hatenablog.jp

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

cp -pr laravel-setup-6-join-queries laravel-setup-7-session-data
cd laravel-setup-7-session-data

設定・実装

新たなコントローラを作成する。

php artisan make:controller '\App\Http\Controllers\SessionController'

このapp/Http/Controllers/SessionController.phpを以下のように編集する。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;

class SessionController extends Controller
{
    public function session()
    {
        Session::put('hoge.hogeString', 'hogehoge');

        if (!Session::has('default.count')) {
            Session::put('default.count', 1);
        } else {
            Session::put('default.count', Session::get('default.count') + 1);
        }
        if (!Session::has('hoge.num')) {
            Session::put('hoge.num', 1);
        } else {
            Session::put('hoge.num', Session::get('hoge.num') + 2);
        }
        if (!Session::has('hoge.obj')) {
            Session::put('hoge.obj', json_decode(json_encode(['cnt' => 1])));
        } else {
            $obj = Session::get('hoge.obj');
            $obj->cnt++;
            Session::put('hoge.obj', $obj);
        }

        if (Session::has('default.hogeString')) {
            $hoge1 = 'Default hoge string is set: ' . Session::get('default.hogeString');
        } else {
            $hoge1 = 'Default hoge string is NOT set';
        }
        if (Session::has('hoge.hogeString')) {
            $hoge2 = 'HOGE hoge string is set: ' . Session::get('hoge.hogeString');
        } else {
            $hoge2 = 'HOGE hoge string is NOT set';
        }

        return view('session.session',
                [
                    'count' => Session::get('default.count'),
                    'num' => Session::get('hoge.num'),
                    'obj' => Session::get('hoge.obj'),
                    'hoge1' => $hoge1,
                    'hoge2' => $hoge2,
                ]);
    }
    public function clear()
    {
        // Session::flush(); // 全データが削除されてしまう
        Session::forget('default.count');
        Session::forget('hoge.hogeString');
        Session::forget('hoge.num');
        Session::forget('hoge.obj');
        // あるいは、Session::all() ですべてのデータを取得して、
        // キー名が正規表現にマッチするもののみSession::forget() する手も考えられる

        return redirect('/session/session');
    }
}

次に、ビューテンプレートresources/views/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"}

最後に、routes/web.phpに以下の行を追記する。

Route::get('/session/session', [\App\Http\Controllers\SessionController::class, 'session']);
Route::get('/session/clear', [\App\Http\Controllers\SessionController::class, 'clear']);

動作確認

以下のURLにアクセスする。

http://<your-ip-address>/laravel-setup-7-session-data/public/session/session

最初のアクセスでは以下のような画面が表示されればOK。

Count: 1
Num: 1
Obj: 1
Hoge1: Default hoge string is NOT set
Hoge2: HOGE hoge string is set: hogehoge 

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

ount: 3
Num: 5
Obj: 3
Hoge1: Default hoge string is NOT set
Hoge2: HOGE hoge string is set: hogehoge 

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

http://<your-ip-address>/laravel-setup-7-session-data/public/session/clear

まとめ

  • Zend Frameworkのようなnamespaceはないが、セッションデータを扱うことはできる