Skip to content

Commit df06aca

Browse files
committed
Refactor: extract DirectoryFilesIterator
This change makes it easy for the client code to migrate toward the newer version. The migration would be as easy as passing `new FilePathIterator(new DirectoryFilesIterator($paths))` into the constructor instead of the array of `$paths`.
1 parent 8b501b9 commit df06aca

File tree

2 files changed

+65
-33
lines changed

2 files changed

+65
-33
lines changed

src/Persistence/Mapping/Driver/ColocatedMappingDriver.php

Lines changed: 4 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,15 @@
44

55
namespace Doctrine\Persistence\Mapping\Driver;
66

7-
use AppendIterator;
87
use Doctrine\Persistence\Mapping\MappingException;
9-
use FilesystemIterator;
10-
use Iterator;
11-
use RecursiveDirectoryIterator;
12-
use RecursiveIteratorIterator;
138
use ReflectionClass;
14-
use RegexIterator;
15-
use SplFileInfo;
169

1710
use function array_merge;
1811
use function array_unique;
1912
use function assert;
2013
use function get_declared_classes;
21-
use function is_dir;
2214
use function preg_match;
23-
use function preg_quote;
2415
use function realpath;
25-
use function sprintf;
2616
use function str_contains;
2717
use function str_replace;
2818

@@ -134,33 +124,14 @@ public function getAllClassNames(): array
134124
throw MappingException::pathRequiredForDriver(static::class);
135125
}
136126

137-
/** @var AppendIterator<array-key,SplFileInfo,Iterator<array-key,SplFileInfo>> $filesIterator */
138-
$filesIterator = new AppendIterator();
127+
$dirFilesIterator = new DirectoryFilesIterator($this->paths, $this->fileExtension);
128+
/** @var iterable<string> $filePathsIterator */
129+
$filePathsIterator = new FilePathNameIterator($dirFilesIterator);
139130

140-
foreach ($this->paths as $path) {
141-
if (! is_dir($path)) {
142-
throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path);
143-
}
144-
145-
/** @var Iterator<array-key,SplFileInfo> $iterator */
146-
$iterator = new RegexIterator(
147-
new RecursiveIteratorIterator(
148-
new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS),
149-
RecursiveIteratorIterator::LEAVES_ONLY,
150-
),
151-
sprintf('/%s$/', preg_quote($this->fileExtension, '/')),
152-
RegexIterator::MATCH,
153-
);
154-
155-
$filesIterator->append($iterator);
156-
}
157-
158-
/** @var iterable<string> $sourceFilePathNames */
159-
$sourceFilePathNames = new FilePathNameIterator($filesIterator);
160131
/** @var array<string,true> $includedFiles */
161132
$includedFiles = [];
162133

163-
foreach ($sourceFilePathNames as $sourceFile) {
134+
foreach ($filePathsIterator as $sourceFile) {
164135
if (preg_match('(^phar:)i', $sourceFile) === 0) {
165136
$sourceFile = realpath($sourceFile);
166137
assert($sourceFile !== false);
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Doctrine\Persistence\Mapping\Driver;
6+
7+
use AppendIterator;
8+
use Doctrine\Persistence\Mapping\MappingException;
9+
use FilesystemIterator;
10+
use Iterator;
11+
use IteratorAggregate;
12+
use RecursiveDirectoryIterator;
13+
use RecursiveIteratorIterator;
14+
use RegexIterator;
15+
use SplFileInfo;
16+
17+
use function is_dir;
18+
use function preg_quote;
19+
use function sprintf;
20+
21+
/** @implements IteratorAggregate<array-key,SplFileInfo> */
22+
final class DirectoryFilesIterator implements IteratorAggregate
23+
{
24+
public function __construct(
25+
/** @var list<string> */
26+
private readonly array $paths,
27+
private readonly string $fileExtension = '.php',
28+
) {
29+
}
30+
31+
/**
32+
* @return Iterator<array-key,SplFileInfo>
33+
*
34+
* @throws MappingException
35+
*/
36+
public function getIterator(): Iterator
37+
{
38+
/** @var AppendIterator<array-key,SplFileInfo,Iterator<array-key,SplFileInfo>> $filesIterator */
39+
$filesIterator = new AppendIterator();
40+
41+
foreach ($this->paths as $path) {
42+
if (! is_dir($path)) {
43+
throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path);
44+
}
45+
46+
/** @var Iterator<array-key,SplFileInfo> $iterator */
47+
$iterator = new RegexIterator(
48+
new RecursiveIteratorIterator(
49+
new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS),
50+
RecursiveIteratorIterator::LEAVES_ONLY,
51+
),
52+
sprintf('/%s$/', preg_quote($this->fileExtension, '/')),
53+
RegexIterator::MATCH,
54+
);
55+
56+
$filesIterator->append($iterator);
57+
}
58+
59+
return $filesIterator;
60+
}
61+
}

0 commit comments

Comments
 (0)