Exemple #1
0
 /**
  * method for making a single file of most used doctrine runtime components
  * including the compiled file instead of multiple files (in worst
  * cases dozens of files) can improve performance by an order of magnitude
  *
  * @throws Doctrine_Compiler_Exception      if something went wrong during the compile operation
  * @return $target Path the compiled file was written to
  */
 public static function compile($target = null, $includedDrivers = array())
 {
     if (!is_array($includedDrivers)) {
         $includedDrivers = array($includedDrivers);
     }
     $excludedDrivers = array();
     // If we have an array of specified drivers then lets determine which drivers we should exclude
     if (!empty($includedDrivers)) {
         $drivers = array('db2', 'mssql', 'mysql', 'oracle', 'pgsql', 'sqlite');
         $excludedDrivers = array_diff($drivers, $includedDrivers);
     }
     $path = Doctrine_Core::getPath();
     $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path . '/Doctrine'), RecursiveIteratorIterator::LEAVES_ONLY);
     foreach ($it as $file) {
         $e = explode('.', $file->getFileName());
         //@todo what is a versioning file? do we have these anymore? None
         //exists in my version of doctrine from svn.
         // we don't want to require versioning files
         if (end($e) === 'php' && strpos($file->getFileName(), '.inc') === false && strpos($file->getFileName(), 'sfYaml') === false) {
             require_once $file->getPathName();
         }
     }
     $classes = array_merge(get_declared_classes(), get_declared_interfaces());
     $ret = array();
     foreach ($classes as $class) {
         $e = explode('_', $class);
         if ($e[0] !== 'Doctrine') {
             continue;
         }
         // Exclude drivers
         if (!empty($excludedDrivers)) {
             foreach ($excludedDrivers as $excludedDriver) {
                 $excludedDriver = ucfirst($excludedDriver);
                 if (in_array($excludedDriver, $e)) {
                     continue 2;
                 }
             }
         }
         $refl = new ReflectionClass($class);
         $file = $refl->getFileName();
         $lines = file($file);
         $start = $refl->getStartLine() - 1;
         $end = $refl->getEndLine();
         $ret = array_merge($ret, array_slice($lines, $start, $end - $start));
     }
     if ($target == null) {
         $target = $path . DIRECTORY_SEPARATOR . 'Doctrine.compiled.php';
     }
     // first write the 'compiled' data to a text file, so
     // that we can use php_strip_whitespace (which only works on files)
     $fp = @fopen($target, 'w');
     if ($fp === false) {
         throw new Doctrine_Compiler_Exception("Couldn't write compiled data. Failed to open {$target}");
     }
     fwrite($fp, "<?php " . implode('', $ret));
     fclose($fp);
     $stripped = php_strip_whitespace($target);
     $fp = @fopen($target, 'w');
     if ($fp === false) {
         throw new Doctrine_Compiler_Exception("Couldn't write compiled data. Failed to open {$file}");
     }
     fwrite($fp, $stripped);
     fclose($fp);
     return $target;
 }
Exemple #2
0
 /**
  * Get available doctrine validators
  *
  * @return array $validators
  */
 public function getValidators()
 {
     if (!$this->_loadedValidatorsFromDisk) {
         $this->_loadedValidatorsFromDisk = true;
         $validators = array();
         $dir = Doctrine_Core::getPath() . DIRECTORY_SEPARATOR . 'Doctrine' . DIRECTORY_SEPARATOR . 'Validator';
         $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir), RecursiveIteratorIterator::LEAVES_ONLY);
         foreach ($files as $file) {
             $e = explode('.', $file->getFileName());
             if (end($e) == 'php') {
                 $name = strtolower($e[0]);
                 $validators[] = $name;
             }
         }
         $this->registerValidators($validators);
     }
     return $this->_validators;
 }
Exemple #3
0
 /**
  * Includes and registers Doctrine-style tasks from the specified directory / directories
  * 
  * If no directory is given it looks in the default Doctrine/Task folder for the core tasks
  * 
  * @param mixed [$directories=null] Can be a string path or array of paths
  */
 protected function includeAndRegisterDoctrineTaskClasses($directories = null)
 {
     if (is_null($directories)) {
         $directories = Doctrine_Core::getPath() . DIRECTORY_SEPARATOR . 'Doctrine' . DIRECTORY_SEPARATOR . 'Task';
     }
     foreach ((array) $directories as $directory) {
         foreach ($this->includeDoctrineTaskClasses($directory) as $className) {
             $this->registerTaskClass($className);
         }
     }
 }
Exemple #4
0
 /**
  *
  * Return the name of a class from its filename.
  *
  * This method simply removes the Doctrine Path and raplces _ with / and 
  * removes .php to get the classname for a file
  *
  * @param string $fileName The name of the file
  * @return string The name of the class
  */
 public function getClassNameFromFileName($fileName)
 {
     $path = Doctrine_Core::getPath() . DIRECTORY_SEPARATOR;
     $class = str_replace($path, "", $fileName);
     $class = str_replace(DIRECTORY_SEPARATOR, "_", $class);
     $class = substr($class, 0, -4);
     return $class;
 }