caisse-bliss/vendor/doctrine/migrations/lib/Doctrine/Migrations/Finder/RecursiveRegexFinder.php

75 lines
1.7 KiB
PHP

<?php
declare(strict_types=1);
namespace Doctrine\Migrations\Finder;
use FilesystemIterator;
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
use RegexIterator;
use function sprintf;
use const DIRECTORY_SEPARATOR;
/**
* The RecursiveRegexFinder class recursively searches the given directory for migrations.
*/
final class RecursiveRegexFinder extends Finder
{
private string $pattern;
public function __construct(?string $pattern = null)
{
$this->pattern = $pattern ?? sprintf(
'#^.+\\%s[^\\%s]+\\.php$#i',
DIRECTORY_SEPARATOR,
DIRECTORY_SEPARATOR
);
}
/**
* @return string[]
*/
public function findMigrations(string $directory, ?string $namespace = null): array
{
$dir = $this->getRealPath($directory);
return $this->loadMigrations(
$this->getMatches($this->createIterator($dir)),
$namespace
);
}
private function createIterator(string $dir): RegexIterator
{
return new RegexIterator(
new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS | FilesystemIterator::FOLLOW_SYMLINKS),
RecursiveIteratorIterator::LEAVES_ONLY
),
$this->getPattern(),
RegexIterator::GET_MATCH
);
}
private function getPattern(): string
{
return $this->pattern;
}
/**
* @return string[]
*/
private function getMatches(RegexIterator $iteratorFilesMatch): array
{
$files = [];
foreach ($iteratorFilesMatch as $file) {
$files[] = $file[0];
}
return $files;
}
}