Show
Ignore:
Timestamp:
11/27/07 18:23:13 (14 months ago)
Author:
jwage
Message:

Further model loading refactoring and refactored merge() in Doctrine_Record

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/lib/Doctrine.php

    r3247 r3250  
    442442 
    443443    /** 
    444      * _loadedModels 
     444     * _loadedModelFiles 
    445445     * 
    446446     * Array of all the loaded models and the path to each one for autoloading 
     
    448448     * @var array 
    449449     */ 
    450     private static $_loadedModels = array(); 
     450    private static $_loadedModelFiles = array(); 
    451451 
    452452    /** 
     
    518518                    $e = explode('.', $file->getFileName()); 
    519519                    if (end($e) === 'php' && strpos($file->getFileName(), '.inc') === false) { 
    520                         self::$_loadedModels[$e[0]] = $file->getPathName(); 
     520                        self::$_loadedModelFiles[$e[0]] = $file->getPathName(); 
    521521                    } 
    522522                } 
    523523            } 
    524         } 
    525  
    526         return self::getLoadedModels(array_keys(self::$_loadedModels)); 
    527     } 
    528  
    529     /** 
    530      * getLoadedModels 
    531      * 
    532      * Get all the loaded models, you can provide an array of classes or it will use get_declared_classes() 
    533      * 
    534      * Will filter through an array of classes and return the Doctrine_Records out of them. 
    535      * If you do not specify $classes it will return all of the currently loaded Doctrine_Records 
    536      * 
    537      * @param classes  Array of classes to filter through, otherwise uses get_declared_classes() 
    538      * @return array   $loadedModels 
    539      */ 
    540     public static function getLoadedModels($classes = null) 
    541     { 
    542         if ($classes === null) { 
    543             $classes = get_declared_classes(); 
    544             $classes = array_merge($classes, array_keys(self::$_loadedModels)); 
    545         } 
    546  
    547         $loadedModels = array(); 
    548  
    549         foreach ((array) $classes as $name) { 
    550             try { 
    551                 $declaredBefore = get_declared_classes(); 
    552                 $class = new ReflectionClass($name); 
    553                 if (self::isValidModelClass($class)) { 
    554                     $loadedModels[] = $name; 
    555                 } 
    556             } catch (Exception $e) { 
    557                 // Determine class names by the actual inclusion of the model file 
    558                 // The possibility exists that the class name(s) contained in the model 
    559                 // file is not the same as the actual model file name itself 
    560                 if (isset(self::$_loadedModels[$name])) { 
    561                     try { 
    562                         require_once self::$_loadedModels[$name]; 
     524 
     525            $loadedModels = array(); 
     526 
     527            $modelFiles = array_keys(self::$_loadedModelFiles); 
     528 
     529            foreach ($modelFiles as $name) { 
     530                if (class_exists($name)) { 
     531                    $declaredBefore = get_declared_classes(); 
     532 
     533                    if (self::isValidModelClass($name) && !in_array($name, $loadedModels)) { 
     534                        $loadedModels[] = $name; 
     535                    } 
     536                } else { 
     537                    // Determine class names by the actual inclusion of the model file 
     538                    // The possibility exists that the class name(s) contained in the model 
     539                    // file is not the same as the actual model file name itself 
     540                    if (isset(self::$_loadedModelFiles[$name])) { 
     541                        require_once self::$_loadedModelFiles[$name]; 
    563542                        $declaredAfter = get_declared_classes(); 
    564543                        // Using array_slice since array_diff is broken is some versions 
    565                         $foundClasses = array_slice($declaredAfter, count($declaredBefore)-1); 
     544                        $foundClasses = array_slice($declaredAfter, count($declaredBefore) - 1); 
    566545                        if ($foundClasses) { 
    567546                            foreach ($foundClasses as $name) { 
    568                                 $class = new ReflectionClass($name); 
    569                                 if (self::isValidModelClass($class)) { 
     547                                if (self::isValidModelClass($name) && !in_array($name, $loadedModels)) { 
    570548                                    $loadedModels[] = $name; 
    571549                                } 
    572550                            } 
    573551                        } 
    574                     } catch (Exception $e) { 
    575                         continue; 
    576552                    } 
    577553                } 
    578554            } 
    579  
    580         } 
    581         return $loadedModels; 
    582     } 
    583  
     555        } 
     556 
     557        return self::filterInvalidModels($loadedModels); 
     558    } 
     559 
     560    /** 
     561     * getLoadedModels 
     562     * 
     563     * Get all the loaded models, you can provide an array of classes or it will use get_declared_classes() 
     564     * 
     565     * Will filter through an array of classes and return the Doctrine_Records out of them. 
     566     * If you do not specify $classes it will return all of the currently loaded Doctrine_Records 
     567     * 
     568     * @param classes  Array of classes to filter through, otherwise uses get_declared_classes() 
     569     * @return array   $loadedModels 
     570     */ 
     571    public static function getLoadedModels($classes = null) 
     572    { 
     573        if ($classes === null) { 
     574            $classes = get_declared_classes(); 
     575            $classes = array_merge($classes, array_keys(self::$_loadedModelFiles)); 
     576        } 
     577 
     578        return self::filterInvalidModels($classes); 
     579    } 
     580 
     581    /** 
     582     * filterInvalidModels 
     583     * 
     584     * Filter through an array of classes and return all the classes that are valid models 
     585     * 
     586     * @param classes  Array of classes to filter through, otherwise uses get_declared_classes() 
     587     * @return array   $loadedModels 
     588     */ 
     589    public static function filterInvalidModels($classes) 
     590    { 
     591        $validModels = array(); 
     592 
     593        foreach ((array) $classes as $name) { 
     594            if (self::isValidModelClass($name) && !in_array($name, $validModels)) { 
     595                $validModels[] = $name; 
     596            } 
     597        } 
     598 
     599        return $validModels; 
     600    } 
    584601 
    585602    /** 
    586603     * isValidModelClass 
    587604     * 
    588      * Checks whether a reflection class is a valid Doctrine model class 
    589      * 
    590      * @param class  A reflection class to validate 
    591      * @return boolean 
     605     * Checks if what is passed is a valid Doctrine_Record 
     606     * 
     607     * @param   mixed   $class Can be a string named after the class, an instance of the class, or an instance of the class reflected 
     608     * @return  boolean 
    592609     */ 
    593610    public static function isValidModelClass($class) 
    594611    { 
     612        if ($class instanceof Doctrine_Record) { 
     613            $class = get_class($class); 
     614        } 
     615 
     616        if (is_string($class) && class_exists($class)) { 
     617            $class = new ReflectionClass($class); 
     618        } 
     619 
    595620        if ($class instanceof ReflectionClass) { 
    596621            // Skip the following classes 
     
    601626                $class->isSubClassOf('Doctrine_Record') && 
    602627                $class->hasMethod('setTableDefinition')) { 
     628 
    603629                return true; 
    604630            } 
    605631        } 
     632 
    606633        return false; 
    607634    } 
    608  
    609635 
    610636    /** 
     
    10021028        } 
    10031029 
    1004         $loadedModels = self::$_loadedModels; 
     1030        $loadedModels = self::$_loadedModelFiles; 
    10051031 
    10061032        if (isset($loadedModels[$className]) && file_exists($loadedModels[$className])) {