0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Symfony ComponentAdvent Calendar 2023

Day 21

ファイルを探すよ、"Finder"

Last updated at Posted at 2023-12-20

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でした。ファイル検索が捗るのでぜひ使ってみてほしいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?