Select Git revision
GlobFinder.php
-
Bartek Jaskulski authored
Signed-off-by:
Bart Jaskulski <bjaskulski@protonmail.com>
Bartek Jaskulski authoredSigned-off-by:
Bart Jaskulski <bjaskulski@protonmail.com>
GlobFinder.php 1.50 KiB
<?php
declare(strict_types=1);
namespace WPDesk\Migrations\Finder;
use WPDesk\Migrations\AbstractMigration;
final class GlobFinder implements MigrationFinder {
public function find_migrations( string $directory ): array {
$dir = realpath( $directory );
if ( $dir === false ) {
return [];
}
$files = glob( rtrim( $dir, '/' ) . '/Version*.php' );
if ( $files === false ) {
$files = [];
}
return $this->load_migrations( $files );
}
/**
* @param string[] $files
*
* @return class-string<AbstractMigration>[]
* @throws \ReflectionException
*/
private function load_migrations( array $files ): array {
$included_files = [];
foreach ( $files as $file ) {
require_once $file;
$real_file = realpath( $file );
if ( $real_file === false ) {
continue;
}
$included_files[] = $real_file;
}
$classes = $this->load_migration_classes( $included_files );
$versions = [];
foreach ( $classes as $class ) {
$versions[] = $class->getName();
}
return $versions;
}
/**
* @param string[] $included_files
* @return \ReflectionClass<AbstractMigration>[]
* @throws \ReflectionException
*/
private function load_migration_classes( array $included_files ): array {
$classes = [];
foreach ( get_declared_classes() as $class ) {
$r = new \ReflectionClass( $class );
if ( ! $r->isSubclassOf( AbstractMigration::class ) ) {
continue;
}
if ( in_array( $r->getFileName(), $included_files, true ) ) {
$classes[] = $r;
}
}
return $classes;