セッション
Flexagon のセッションは、モデルオブジェクトをサーバー側のファイルではなく 暗号化された Cookie にシリアライズします。共有のセッションストアが存在しないため、複数の Web サーバーへ水平スケールする場合でも、セッションストレージに関する追加設定は必要ありません。
設定
// application/_Config.php
_Global::$SESSION_AUTO_START = true;
_Global::$SESSION_ENCRYPTION_STRING = Env::required('SESSION_ENCRYPTION_STRING'); // .env.php から取得
_Global::$SESSION_DOMAIN = '.example.com';
_Global::$SESSION_TIMEOUT_SECONDS = 86400;
// Cookie のセキュリティ属性 — デフォルト値はすでに安全なため、通常は変更する必要はありません。
_Global::$SESSION_COOKIE_SECURE = null; // null = HTTPS リクエストでは自動的に有効化
_Global::$SESSION_COOKIE_HTTPONLY = true; // JavaScript からセッション Cookie へのアクセスを防止
_Global::$SESSION_COOKIE_SAMESITE = 'Lax';
セッション Cookie は認証状態を保持するため、HttpOnly と SameSite=Lax がデフォルトで有効になっており、HTTPS リクエストでは Secure が自動的に付与されます。HTTPS の判定は、$_SERVER['HTTPS']、ポート 443、X-Forwarded-Proto の順に確認します。
セッションモデルと DAO
<?php
namespace Session;
use _Flexagon\Base\BaseModel;
class SessionUserModel extends BaseModel {
private string $role = 'USER';
private ?string $username = '';
private ?string $email = '';
// getter / setter ...
}
<?php
namespace Session;
use _Flexagon\Base\BaseSessionDAO;
class SessionDAO extends BaseSessionDAO {}
使い方
// ログイン
$sessionUser = new SessionUserModel();
$sessionUser->setUsername($user->getUsername());
$sessionUser->setRole('ADMIN');
$sessionDAO = new SessionDAO();
$sessionDAO->makeSession($sessionUser);
// ログアウト
$sessionDAO->cleanSession();
$SESSION_AUTO_START が有効な場合、セッションはブートストラップ時に復元され、次の 2 か所で参照できます。
_Global::$SESSION_MODEL; // 常にここで参照可能
_Global::$SESSION_USER_MODEL; // クラス名に基づくグローバル(後述)
2 つ目の形式は、モデルのクラス名を UPPER_SNAKE_CASE に変換して導出されます(SessionUserModel → SESSION_USER_MODEL)。型ヒント付きでアクセスするには、対応する static プロパティを _Global に あらかじめ 宣言しておいてください。
class _Global extends BaseGlobal {
public static ?\Session\SessionUserModel $SESSION_USER_MODEL = null;
}
よく使われるパターンは、_prepare.php で認可チェックを行う方法です。
<?php
// public/_prepare.php
if (str_starts_with(_Global::$URL_PARAM->filePath, 'admin/')) {
if (_Global::$SESSION_USER_MODEL?->getRole() !== 'ADMIN') {
\_Flexagon\Libs\HtmlUtil::redirectPage('/login');
}
}
注意: セッションモデルのプロパティに
@encryptを付けると、Cookie 内で二重に暗号化されます。セッション Cookie 全体はすでに$SESSION_ENCRYPTION_STRINGで暗号化されているため、通常この追加のアノテーションは不要です。