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");
}
?>

これもっといい方法無いのかな。

Comments


Option