株式会社NextCodeのロゴ株式会社NextCode

BLOG

ブログ

2022/02/20

ファイル取得に便利!PHP Symfony finder 使い方

今回はSymfonyのfinderの使い方をレクチャーしましょう。

そもそもSymfonyのfinderって何だ?って人がいるかもしれないので、そこから触れていきます。

Symfonyのfinderとは?

Symfonyはフレームワークになります。

フレームワークとして有名な、LaravelやCakePHPと同じです。

finderはSymfonyの中の一部として組み込まれているファイルやディレクトリ検索に特化したライブラリです。

このfinderはcomposerで利用出来る様にSymfonyが提供してくれています。

その為、Laravelでも使用可能ですし、フレームワークを使っていなくても使用出来ます。

使い方

まずはcomposerでfinderライブラリを落としてきます。

composer require symfony/finder

finderを読み込み使用してみます。

finderの読み込みはその時の環境によって適宜変更して下さい。

フレームワークを使用している場合は、vendor/autoload.phpを読み込んでいると思いますので、自動的に読み込まれます。

次の例では、フレームワークを使用していない為、vendor/autoload.phpを読み込んでいます。

require './vendor/autoload.php';

use Symfony\Component\Finder\Finder;

$finder = new Finder();
// vendorディレクトリ内直下を指定
$files = $finder->in('./vendor')->depth(0);

foreach($files as $file) {
	// ファイル・ディレクトリ名を出力
	echo $file->getRelativePathname() . PHP_EOL;
}

実行結果は….

autoload.php
composer
symfony

無事に取得できましたね。

ここでは、vendorディレクトリ内直下のファイル・ディレクトリ名の出力を行いました。

取得時の基本的な使い方は全てアロー(->)にて繋げて書いていきます。(メソッドチェーン)

これは結構重要なのですが、$filesはオブジェクトなので配列として扱う事は出来ません

その為、次の様な使い方はNGです。

use Symfony\Component\Finder\Finder;

$finder = new Finder();
$files = $finder->in('./vendor')->depth(0);

$filenames = array_map(function ($file) {
	return $file->getRelativePathname();
}, $files);

これを使える様にするには、配列に変換する必要があるので、次の様にしましょう。

「$files = iterator_to_array($files);」を追加し、配列に変換しました。

require './vendor/autoload.php';

use Symfony\Component\Finder\Finder;

$finder = new Finder();
$files = $finder->in('./vendor')->depth(0);

$files = iterator_to_array($files);

$filenames = array_map(function ($file) {
	return $file->getRelativePathname();
}, $files);

$filenamesをvar_dumpした出力結果は次の様になります。

array(3) {
  ["./vendor/autoload.php"]=>
  string(12) "autoload.php"
  ["./vendor/composer"]=>
  string(8) "composer"
  ["./vendor/symfony"]=>
  string(7) "symfony"
}

関数について

ここからメソッドチェーンとして使用出来る関数をご紹介します。

※上で使用していた「$files」にアロー(->)で繋げて書く関数

files

ファイルだけを検索

※name()については後述

$finder->files();

directories

ディレクトリだけを検索

$finder->directories();

in

検索するディレクトリの指定

// パターン1
$finder->in(__DIR__);

// パターン2(複数指定)
$finder->in([__DIR__, '/elsewhere']);

// パターン3(ワイルドカード)
$finder->in('src/Symfony/*/*/Resources');

name

ファイル名・ディレクトリ名を指定して検索

// パターン1
$finder->files()->name('*.php');

// パターン2(複数指定)
$finder->files()->name(['*.php', '*.twig']);

// パターン3(正規表現)
$finder->files()->name('/\.php$/');

size

ファイルサイズを指定して検索

// パターン1
$finder->files()->size('< 1.5K');

// パターン2(範囲指定)
$finder->files()->size(['>= 1K', '<= 2K']);

date

最終更新日を指定して検索

文字列指定をした場合は、strtotimeでサポートされている文字列が指定出来ます。

// パターン1
$finder->date('>= 2018-01-01');

// パターン2(範囲指定)
$finder->date(['>= 2018-01-01', '<= 2018-12-31']);

// パターン3(文字列指定)
$finder->date('since yesterday');

depth

ディレクトリの深さを指定して検索

// パターン1
$finder->depth(0);

// パターン2(2階層より下)
$finder->depth('> 2');

// パターン3(範囲指定)
$finder->depth(['> 2', '< 5']);

sortByName

ファイル・ディレクトリ名で並び替え(最初にディレクトリ、次にファイルの順で並び替え)

$finder->sortByName();

sortByType

タイプで並び替え(最初にディレクトリ、次にファイルの順で並び替え)

$finder->sortByType();

関数について2

「$file」にアロー(->)で繋げて関数

下記ではSymfonyで作成された関数だけ記述していますが、PHPのSplFileInfoの関数がそのまま使用出来るので、他に何があるのか気になる方は、PHP公式サイトを参照下さい!

getRelativePathname

拡張子付きファイル名を取得

echo $file->getRelativePathname();

getContents

ファイルの中身を取得

echo $file->getContents();

参照サイト

https://symfony.com/doc/current/components/finder.html

https://www.php.net/manual/ja/class.splfileinfo.php

TOPへ移動
PAGE
TOP
%d人のブロガーが「いいね」をつけました。