LoginSignup
0
0

ファイルやフォルダを制御、"Filesystem"

Last updated at Posted at 2023-12-03

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]は超便利なのでぜひ!

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