Класс Finder
Класс Finder предназначен для поиска
файлов и директорий в файловой системе. Он
позволяет фильтровать результаты по имени,
размеру, дате изменения, содержимому и другим
параметрам. Первым делом указывается директория
поиска методом in, затем накладываются
фильтры, а метод getIterator возвращает
найденные элементы.
Синтаксис
<?php
use Symfony\Component\Finder\Finder;
$finder = new Finder();
$finder->in($dir)->files()->name($pattern);
$iterator = $finder->getIterator();
?>
Пример
Давайте найдём все файлы с расширением
'.php' в директории 'src':
<?php
namespace App\Service;
use Symfony\Component\Finder\Finder;
class FileService
{
public function findPhpFiles(): array
{
$finder = new Finder();
$finder->in('src')->files()->name('*.php');
$res = [];
foreach ($finder as $file) {
$res[] = $file->getFilename();
}
return $res;
}
}
?>
Результат выполнения кода:
["FileService.php", "ArticleController.php", "Kernel.php"]
Пример
Давайте найдём все директории внутри
'src':
<?php
namespace App\Service;
use Symfony\Component\Finder\Finder;
class FileService
{
public function findDirectories(): array
{
$finder = new Finder();
$finder->in('src')->directories();
$res = [];
foreach ($finder as $dir) {
$res[] = $dir->getFilename();
}
return $res;
}
}
?>
Результат выполнения кода:
["Controller", "Service", "Repository"]
Пример
Давайте отфильтруем файлы по имени с помощью регулярного выражения и отсортируем их:
<?php
namespace App\Service;
use Symfony\Component\Finder\Finder;
class FileService
{
public function findByName(): array
{
$finder = new Finder();
$finder
->in('src')
->files()
->name('/^Article/')
->sortByName();
$res = [];
foreach ($finder as $file) {
$res[] = $file->getRelativePathname();
}
return $res;
}
}
?>
Результат выполнения кода:
["Controller/ArticleController.php", "Entity/Article.php"]
Пример
Давайте исключим служебные директории и
воспользуемся пользовательским фильтром
через метод filter:
<?php
namespace App\Service;
use Symfony\Component\Finder\Finder;
class FileService
{
public function findFiltered(): array
{
$finder = new Finder();
$finder
->in('src')
->files()
->exclude('Kernel')
->filter(function ($file) {
return $file->getSize() > 100;
});
$res = [];
foreach ($finder as $file) {
$res[] = $file->getFilename();
}
return $res;
}
}
?>
Результат выполнения кода:
["ArticleController.php", "Article.php"]
Пример
Давайте проверим наличие результатов и посчитаем их количество:
<?php
namespace App\Service;
use Symfony\Component\Finder\Finder;
class FileService
{
public function countFiles(): int
{
$finder = new Finder();
$finder->in('src')->files()->name('*.php');
if (!$finder->hasResults()) {
return 0;
}
return $finder->count();
}
}
?>
Результат выполнения кода:
3
Смотрите также
-
метод
in,
который задаёт директорию для поиска -
метод
files,
который ограничивает поиск только файлами -
метод
name,
который фильтрует элементы по имени -
метод
getIterator,
который возвращает итератор найденных элементов