tohokuaikiのチラシの裏

技術的ネタとか。

PHPのSlim Frameworkでセッションを使う

別に普通にsession_start()とかしてもよかったんだろうけど、なんとなくMiddlewareとか使ってみた。

使ってみたのはいいけど、どうもSlim FrameworkのMiddlewareは基本的に手出しができないものらしくって、そのMiddleware内部のObjectに手を出そうとしたらContainerを扱わなきゃなくなってしまって、とても面倒だった。

とりあえず、SESSIONをスタートさせたい。

Middlewareに登録するセッションライブラリのインストール

ChatGPTに聞いたら、これが良いみたいな話だったので GitHub - odan/session: A middleware oriented session handler for PHP and Slim 4+ を使う。

composer install odan/session

Middlewareに登録する。

Slim Frameworkのエントリポイントのadd()で登録する。

<?php
use Odan\Session\Middleware\SessionStartMiddleware;
use Odan\Session\PhpSession;

$app = AppFactory::create();
$app->add(new SessionStartMiddleware(new PhpSession([
    'path' => '/',
    'name' => 'your-session-name'
])));

とりあえずこんな感じでページを開くと自動的にセッションが始まる。

セッションの読み書き

普通にグローバル変数 $_SESSION を使う。

セッションの読み書きにグローバル変数$_SESSIONはいかがなものか?

何となくカッコ悪いというか、今更グローバル変数$_SESSIONもどうよって感じでもにょっとするのでカッコよくコンテナ経由で操作したい。要は、 new PhpSessionのObjectにアクセスしたいんですわ。

Middleware登録時にコンテナに結び付ける。

DIのライブラリ php-di/slim-bridge をインストール

composer require php-di/slim-bridge

以下のポイントは2点

  • createする前にContainerをセットする
  • Containerに session という名称でObjectをセットしておく
<?php
use Odan\Session\Middleware\SessionStartMiddleware;
use Odan\Session\PhpSession;
use DI\Container;

$container = new Container();
AppFactory::setContainer($container);
$app = AppFactory::create();
$app->add(new SessionStartMiddleware($session = new PhpSession([
    'path' => '/',
    'name' => $_ENV['APP_NAME']
])));
$container->set('session', $session);

$sessionを使う

$appさえ使えるならどこでも引っ張り出せます。

<?php
$session = $app->getContainer()->get("session");
$oldValue = $session->get('foo');
$session->set('foo', $newValue);

みたいな。

Slim Frameworkは情報が少ないのか、ChatGPTやGeminiに聞いても嘘ばっかで全く役に立たなかったよ。逆に言うと、AIがここまで使えなかったホンの数年前は面倒くさかったんだよなぁ。もう忘れてしまったけど。