Sessionの実装例

Hello Worldの実装をもとに、Naify Sessionを追加する例を紹介します。ブートストラップで開始し、Controller側で認証状態やFlashメッセージを扱います。

このページでは追加する処理を紹介します。ファイル配置と公開入口、BaseController、NaifyViewの初期化とgetView()を先に用意します。Controllerとテンプレートを追加したら、対応するURLを routes/routes.php に登録します。

ブートストラップで開始する

HTTPリクエストの入口となる SampleAppBootstrap.php でSessionを開始します。この例ではマイページの描画に使うNaifyViewも起動します。

// SampleAppBootstrap.php(プロジェクト直下)
use Naify\Naify;
use Naify\Session\Session;

require __DIR__ . '/libs/Naify/Naify.php';

Naify::boot();
Naify::autoload('App', __DIR__ . '/app');
Session::start();

require __DIR__ . '/libs/NaifyView/NaifyView.php';
\NaifyView\NaifyView::boot();

$config = Naify::createConfig()
    ->setAppId('sample-app')
    ->setSystemDir(__DIR__)
    ->setPublicDir(__DIR__ . '/public')
    ->setConfigDir(__DIR__ . '/config')
    ->setBasePath($_SERVER['SCRIPT_NAME'] ?? '/');

$app = Naify::createWebApp($config);
$app->loadRoute('routes/routes.php');
$app->run();

AuthController

ログイン時はセッションIDを再生成し、必要な値だけStorageへ保存します。Flashは pop() で取得後に削除できます。

namespace App\Controllers;

use Naify\Session\Session;

final class AuthController extends BaseController
{
    public function loginAction(): void
    {
        // 認証処理はアプリ側で実装する
        $userId = 1;

        Session::regenerateId();
        Session::getStorage('auth', ttl: 3600)->set('user_id', $userId);
        Session::getStorage('flash', ttl: 300)->set('message', 'ログインしました');

        header('Location: /mypage');
    }

    public function logoutAction(): void
    {
        Session::getStorage('auth')->destroy();
        Session::getStorage('flash', ttl: 300)->set('message', 'ログアウトしました');

        header('Location: /login');
    }
}

MyPageController

認証状態をSessionから取得し、Viewへ値を渡します。未ログインならログイン画面へ戻します。

namespace App\Controllers;

use Naify\Session\Session;

final class MyPageController extends BaseController
{
    public function indexAction(): void
    {
        $userId = Session::getStorage('auth')->get('user_id');
        if ($userId === null) {
            header('Location: /login');
            return;
        }

        $view = $this->getView();
        $view->assign('userId', $userId);
        $view->assign('message', Session::getStorage('flash')->pop('message'));
        $view->setTemplate('mypage.html');
    }
}

Viewテンプレート

Flashメッセージやユーザー情報は、通常の変数としてテンプレートに渡します。

<nf-if test="message">
  <p class="notice">{{ message }}</p>
</nf-if>

<h1>マイページ</h1>
<p>User ID: {{ userId }}</p>
<a href="/logout">ログアウト</a>