vendor/doctrine/migrations/lib/Doctrine/Migrations/Finder/Finder.php line 26

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Doctrine\Migrations\Finder;
  4. use Doctrine\Migrations\Finder\Exception\InvalidDirectory;
  5. use Doctrine\Migrations\Finder\Exception\NameIsReserved;
  6. use ReflectionClass;
  7. use function assert;
  8. use function get_declared_classes;
  9. use function in_array;
  10. use function is_dir;
  11. use function realpath;
  12. use function strlen;
  13. use function strncmp;
  14. /**
  15.  * The Finder class is responsible for for finding migrations on disk at a given path.
  16.  */
  17. abstract class Finder implements MigrationFinder
  18. {
  19.     protected static function requireOnce(string $path): void
  20.     {
  21.         require_once $path;
  22.     }
  23.     /**
  24.      * @throws InvalidDirectory
  25.      */
  26.     protected function getRealPath(string $directory): string
  27.     {
  28.         $dir realpath($directory);
  29.         if ($dir === false || ! is_dir($dir)) {
  30.             throw InvalidDirectory::new($directory);
  31.         }
  32.         return $dir;
  33.     }
  34.     /**
  35.      * @param string[] $files
  36.      *
  37.      * @return string[]
  38.      *
  39.      * @throws NameIsReserved
  40.      */
  41.     protected function loadMigrations(array $files, ?string $namespace): array
  42.     {
  43.         $includedFiles = [];
  44.         foreach ($files as $file) {
  45.             static::requireOnce($file);
  46.             $realFile realpath($file);
  47.             assert($realFile !== false);
  48.             $includedFiles[] = $realFile;
  49.         }
  50.         $classes  $this->loadMigrationClasses($includedFiles$namespace);
  51.         $versions = [];
  52.         foreach ($classes as $class) {
  53.             $versions[] = $class->getName();
  54.         }
  55.         return $versions;
  56.     }
  57.     /**
  58.      * Look up all declared classes and find those classes contained
  59.      * in the given `$files` array.
  60.      *
  61.      * @param string[]    $files     The set of files that were `required`
  62.      * @param string|null $namespace If not null only classes in this namespace will be returned
  63.      *
  64.      * @return ReflectionClass<object>[] the classes in `$files`
  65.      */
  66.     protected function loadMigrationClasses(array $files, ?string $namespace null): array
  67.     {
  68.         $classes = [];
  69.         foreach (get_declared_classes() as $class) {
  70.             $reflectionClass = new ReflectionClass($class);
  71.             if (! in_array($reflectionClass->getFileName(), $filestrue)) {
  72.                 continue;
  73.             }
  74.             if ($namespace !== null && ! $this->isReflectionClassInNamespace($reflectionClass$namespace)) {
  75.                 continue;
  76.             }
  77.             $classes[] = $reflectionClass;
  78.         }
  79.         return $classes;
  80.     }
  81.     /**
  82.      * @param ReflectionClass<object> $reflectionClass
  83.      */
  84.     private function isReflectionClassInNamespace(ReflectionClass $reflectionClassstring $namespace): bool
  85.     {
  86.         return strncmp($reflectionClass->getName(), $namespace '\\'strlen($namespace) + 1) === 0;
  87.     }
  88. }