Symfony Component Advent Calendar 2023の4日目の記事です。
ファイルやフォルダを制御、"Filesystem"
Filesystem
はファイルやフォルダを制御する行うコンポーネントです。OS依存を汲み取ってくれます。Symfony以外でも動作します。
インストール
composer install symfony/filesystem
使い方
use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
use Symfony\Component\Filesystem\Filesystem;
$filesystem = new Filesystem();
try {
$filesystem->dumpFile('data.txt', 'Hello world!'); // ファイル書き込み
$filesystem->appendToFile('data.txt', 'Hello again'); // 追記
$filesystem->copy('data.txt', 'duplicate.txt'); // コピー
$filesystem->remove('data.txt'); // 削除
$filesystem->mkdir('data'); // mkdir
$filesystem->chmod('data', 0600); // chmod
$filesystem->chmod('data', 0600, recursive: true); // 再起的chmod
$filesystem->symlink('data', 'data-link'); //symlink
} catch (IOExceptionInterface $exception) {
echo 'error: ' . $exception->getPath();
}
パスの正規化
/var/www/html/src/../config/services.yaml
みたいなファイルパスを正規化することができる Path
クラスがあります。
use Symfony\Component\Filesystem\Path;
$path = Path::canonicalize('/var/www/html/src/../config/services.yaml';
// /var/www/html/config/services.yaml
$path = Path::canonicalize('config/packages/doctrine/test/../../../services.yaml');
// config/services.yaml
$path = Path::canonicalize('C:Programs/PhpStorm/..');
// /C:Programs
絶対パス・相対パス化
相対パスを指定のディレクトリからの絶対パスに変更もできます。その逆も可能です。
$path = Path::makeAbsolute('config/services.yaml', '/var/www/html/');
// /var/www/html/config/services.yaml
$path = Path::makeAbsolute('..', '/var/www/html');
// /var/www
$path = Path::makeRelative('/var/www/html/config/services.yaml', '/var/www/html');
// config/services.yaml
余談:Symfonyのプロジェクトルートディレクトリ
Symfonyのプロジェクトのルートディレクトリは、パラメータ kernel.project_dir
で取得できます。よって、基本はDI(オートワイヤリング)して使います。Symfony 6.3から #[Autowire]
が使えるようになったのでとても楽にDIすることができます。
public function __construct(#[Autowire(param: 'kernel.project_dir')] private readonly string $projectDir)
{
parent::__construct();
}
protected function write()
{
$filesystem = new Filesystem();
$filesystem->dumpFile(
Path::makeAbsolute('var/test.txt', $this->projectDir),
// /var/www/html/var/test.txt
'hello world.'
);
}
まとめ
今回はFilesystem
でした。Symfonyでファイル触るならこれですね。Symfony6.3からの#[Autowire]
は超便利なのでぜひ!