Symfony Component Advent Calendar 2023の21日目の記事です。
ファイルを探すよ、"Finder"
Finderは、ファイルやディレクトリを探すコンポーネントです。Symfony以外でも使えます。
インストール
composer require symfony/finder
使い方
use Symfony\Component\Finder\Finder;
$finder = new Finder();
// /var/www/html/assets/内の*.jsを探す
$finder->files()->in('/var/www/html/assets')->name("*.js");
// 探した結果があるか確かめる
if ($finder->hasResults()) {
...
}
// 探した結果をループで回す
foreach ($finder as $file) {
$path = $file->getRealPath(); // 絶対パス
}
Finder
オブジェクトを作成し、指定した条件のメソッドを実行することで検索します。
結果はFinder
オブジェクト自体で、ループで回すことができます。
ループで回せるのは、Finderがこうなってるから
class Finder implements \IteratorAggregate, \Countable
検索条件
検索条件は主に以下のようなものがあり、複数繋げることができます。
メソッド | 内容 | 引数例 |
---|---|---|
files() | ファイルのみを検索 | |
directories() | ディレクトリのみを検索 | |
name() | ファイル名で検索 | '.php', '/.php$/', ['.php', '*.twig'] |
notName() | ファイル名を除外 | '.php', ['.php', '*.twig'] |
contains() | ファイルの内容で検索 | 'hoge', '/hoge/' |
path() | パスで検索 | 'assets/img' |
notPath() | パスを除外 | '/assets/img' |
size() | ファイルサイズで検索 | '< 1.5M', '>= 1K' |
date() | ファイルの更新日時で検索 | '>= 2023-12-01' |
depth() | ディレクトリの深さを指定 | '== 0', '< 3' |
// 例
$finder
->files() // ファイルで
->in('/var/www/') // /var/wwwの
->depth('< 5') // ディレクトリの深さは5未満で
->name('*.js') // ファイル名が*.jsで
->size('< 1K') // 1K未満で
->date('>= 2023-12-01') // 2023/12/01以降に更新されたファイル
;
外部ストレージ
in()
メソッドは、URLタイプのプロトコル(ftp://
, 'file://`など)で検索することもできます。
登録すれば、外部ストレージもアクセスできます。
$s3Client = new S3Client();
$s3Client->registerStreamWrapper(); // `s3://` 登録
$finder->in('s3://bucker-name')->name('*.csv');
まとめ
今回はFinder
でした。ファイル検索が捗るのでぜひ使ってみてほしいです。