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>