Mojavi + DB_DataObject使ってるとやっぱり、
$Member =& DB_DataObject::factory('Member');
$Member->get("userName", $request->getParameter("userName"));
if ($Member->password == md5($request->getParameter("password"))) {
$user->setAuthenticated(true);
$user->setAttribute("Member", $Member);
}
こんな感じで$userに$Memberを突っ込んだりしたくなるわけですよ。
でも悲しいことにPHPのセッションはリクエスト毎にファイルにserialize ⇒ ファイルからunserializeをしてるだけなのでunserializeするとき(session_start時)にクラスが宣言されて無いとPHP_Incomplete_Classという謎オブジェクトが。
Mojaviでsession_startはSessionContainer#loadでやっているのでFilterでは遅いようです。しょうがないのでPHP_Incomplete_Classが現れた時に動くコールバック関数を指定するunserialize_callback_funcを使って無理やり読み込むことにしました。
<?php
ini_set("unserialize_callback_func", "findIncompleteClass");
function findIncompleteClass($className) {
$config = parse_ini_file(BASE_DIR."configs/DB_DataObject.ini", true);
$name = str_replace(strtolower($config["DB_DataObject"]["class_prefix"]), "", $className);
include_once($config["DB_DataObject"]["require_prefix"]."/".$name.".php");
}
?>
これもっといい方法無いのかな。