/** * Universal factory for DataObject() and BaseObject() instances with caching capabilities * @param ObjectUri $uri * @param string $class * @param string $type * @throws Exception * @return \t41\ObjectModel\DataObject|t41\ObjectModel\BaseObject */ public static function _($uri, $class = null, $type = ObjectModel::MODEL) { if (!$uri instanceof ObjectUri) { if (is_null($class)) { throw new Exception("Give ObjectUri() instance or specify object class as second argument"); } $uri = new ObjectUri($uri); $uri->setClass($class); } else { $class = $uri->getClass(); } if (self::getEnvData('cache_objects') !== true) { $obj = DataObject::factory($class); $obj->setUri($uri); Backend::read($obj); return $type == ObjectModel::MODEL ? new $class($obj) : $obj; } $def = ObjectModel::getObjectDna($class); if ($def && isset($def['unchanging'])) { // get cache version if (($obj = self::cacheGet($uri->getPermanentUUID())) !== false) { self::log(sprintf('[Persistence] Loaded %s object (%s) from cache', $class, $uri)); } else { // done this away to avoid infinite recursion in BaseObject::__construct() $obj = DataObject::factory($class); $obj->setUri($uri); Backend::read($obj); $obj = new $class($obj); self::cacheSet($obj, $uri->getPermanentUUID(), true, array('tags' => array('permanent'))); self::log(sprintf('[Persistence] Saved %s object (%s) in cache', $class, $uri)); } return $type == ObjectModel::MODEL ? $obj : $obj->getDataObject(); } else { $obj = DataObject::factory($class); $obj->setUri($uri); Backend::read($obj); return $type == ObjectModel::MODEL ? new $class($obj) : $obj; } }
protected function _getTableFromUri(ObjectModel\ObjectUri $uri) { if ($uri instanceof ObjectModel\ObjectUri && $uri->getUrl()) { $els = explode('/', $uri->getUrl()); if (count($els) > 1 && $els[count($els) - 2] != $this->_database) { return $els[count($els) - 2]; } else { return $this->_getTableFromClass($uri->getClass()); } } else { return $this->_getTableFromClass($uri->getClass()); } }
/** * Returns an instance of an object based on definition matching the given id * * @param string|ObjectModel\ObjectUri $param class id or object uri * @throws ObjectModel\Exception * @return ObjectModel\BaseObject */ public static function factory($param) { if ($param instanceof DataObject) { $class = $param->getClass(); return new $class($param); } $class = $param instanceof ObjectModel\ObjectUri ? $param->getClass() : $param; if (!array_key_exists($class, self::$_config)) { throw new ObjectModel\Exception(array('NO_CLASS_DECLARATION', $class)); } try { $obj = new $class($param instanceof ObjectModel\ObjectUri ? $param : null); } catch (ObjectModel\Exception $e) { die($e->getMessage()); } catch (ObjectModel\DataObject\Exception $e) { die($e->getMessage()); } return $obj; }