示例#1
0
文件: Nova.php 项目: sonicmaster/RPG
 /**
  * Instanciate a resource model
  *
  * @param string $resourceModel
  * @param string $context
  * @param array $params
  * @return Nova_Core_ResourceInterface
  */
 public static function getResourceModel($resourceModel, $context = NULL, $params = array())
 {
     if (is_null($context)) {
         $context = self::RESOURCE_DEFAULT_CONTEXT;
     }
     $offset = strpos($resourceModel, '/');
     if ($offset === false) {
         self::throwException('core/exception', 'Wrong class identifier format.');
     }
     $moduleName = substr($resourceModel, 0, $offset);
     $classSuffix = substr($resourceModel, $offset + 1);
     if (isset(self::$_resourceModelClassCache[$moduleName]) && isset(self::$_resourceModelClassCache[$moduleName][$classSuffix]) && isset(self::$_resourceModelClassCache[$moduleName][$classSuffix][$context])) {
         $className = self::$_resourceModelClassCache[$moduleName][$classSuffix][$context];
     } else {
         Nova::profilerStart("CORE.RESOURCE.LOAD " . __METHOD__ . " [{$resourceModel}]");
         // TODO : implement a clean configuration loading
         if (is_null(self::$_modelsConfig)) {
             Nova::profilerStart("CORE.MODEL.CONFIG.LOAD");
             self::$_modelsConfig = new Zend_Config(self::app()->getConfig('global.models'));
             Nova::profilerStop("CORE.MODEL.CONFIG.LOAD");
         }
         //TODO : implement a clean configuration navigation
         $config = self::$_modelsConfig->get($moduleName)->get('resource')->get($context);
         if (!$config) {
             Nova::profilerStop("CORE.RESOURCE.LOAD " . __METHOD__ . " [{$resourceModel}]");
             return NULL;
         } else {
             if ($config->get('rewrite') && $config->get('rewrite')->get($classSuffix)) {
                 $className = $config->get('rewrite')->get($classSuffix);
             } else {
                 $className = $config->get('class_prefix') . self::_translateClassName($classSuffix);
             }
         }
         self::$_resourceModelClassCache[$moduleName][$classSuffix][$context] = $className;
         Nova::profilerStop("CORE.RESOURCE.LOAD " . __METHOD__ . " [{$resourceModel}]");
     }
     $reflectionClass = new ReflectionClass($className);
     if ($reflectionClass->isSubclassOf('Nova_Core_Object')) {
         $object = $reflectionClass->newInstance($moduleName, $params);
     } else {
         $object = $reflectionClass->newInstanceArgs($params);
     }
     return $object;
 }