Skip to content
Snippets Groups Projects
Select Git revision
  • 26b6d1b127e670b9707ff94759df58d9a9002b58
  • main default protected
  • devel
  • 1.1.0
  • 1.0.4
  • 1.0.3
  • 1.0.2
  • 1.0.1
  • 1.0.0
9 results

GlobFinder.php

Blame
  • 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;