/** * все сохранение делается внутри транзакции (включая beforeSave и afterSave), если будет исключение - транзакция будет откачена PDO */ public function save() { ActiveRecordHelper::exceptionIfObjectIsIncompatibleWithActiveRecord($this); $obj_class_name = get_class($this); $obj_db_id = $obj_class_name::DB_ID; $transaction_is_my = false; if (!DBWrapper::inTransaction($obj_db_id)) { DBWrapper::beginTransaction($obj_db_id); $transaction_is_my = true; } $this->beforeSave(); \OLOG\Model\ActiveRecordHelper::saveModelObj($this); // не вызываем afterSave если это вызов save для этого объекта изнутри aftersave этого же объекта (для предотвращения бесконечного рекурсивного вызова afterSave) static $__inprogress = []; $inprogress_key = FullObjectId::getFullObjectId($this); if (!array_key_exists($inprogress_key, $__inprogress)) { $__inprogress[$inprogress_key] = 1; $this->afterSave(); unset($__inprogress[$inprogress_key]); } // комитим только если мы же и стартовали транзакцию (на случай вложенных вызовов) if ($transaction_is_my) { DBWrapper::commitTransaction($obj_db_id); } }
public function testFullObjectId() { $this->assertEquals('not_object', \OLOG\FullObjectId::getFullObjectId('')); $id = rand(1, 1000); $test_obj = new \Tests\TestObject($id); $this->assertEquals(\Tests\TestObject::class . '.' . $id, \OLOG\FullObjectId::getFullObjectId($test_obj)); }
/** * @param $obj InterfaceOwner * Does not saves object - designed to be called from constructor. */ public static function assignCurrentUserAsOwnerToObj($obj) { Assert::assert($obj instanceof InterfaceOwner); Assert::assert($obj instanceof InterfaceLoad); static $__inprogress = []; $inprogress_key = FullObjectId::getFullObjectId($obj); if (array_key_exists($inprogress_key, $__inprogress)) { return; } $__inprogress[$inprogress_key] = 1; // заполняем при создании объекта if (!$obj->getId()) { $current_user_id = Auth::currentUserId(); if ($current_user_id) { $obj->setOwnerUserId($current_user_id); $current_user_obj = User::factory($current_user_id); $obj->setOwnerGroupId($current_user_obj->getPrimaryGroupId()); } } unset($__inprogress[$inprogress_key]); }