Laravel にはストレージというファイルシステム操作用の仕組みがあります。ざっくばらんに言えば /config/filesystems.php 中に記述した設定であるディスクの指すパス以下のファイルとディレクトリを簡易に操作する仕組みです。
ファイルストレージ 8.x Laravel
もし設定ファイル /config/filesystems.php 中に次の記述があれば、
return [
'disks' => [
'member' => [
'driver' => 'local',
'root' => storage_path('app/member'),
'url' => env('APP_URL').'/api/storage/member/',
],
],
];
次の様に プロジェクトルート/storage/app/member 以下のファイルを比較的楽に操作できます。
// プロジェクトルート/storage/app/member/text/test.txt にファイルを保存
\Storage::disk('member')->put('text/test.txt', '本文');
// プロジェクトルート/storage/app/member/text/test.txt のファイルを削除
\Storage::disk('member')->delete('text/test.txt');
// プロジェクトルート/storage/app/member/text/test.txt のファイルをダウンロードするレスポンスを生成
// これは大体コントローラのメソッドの返り値になります
\Storage::disk('member')->download('text/test.txt');
便利な仕組みなのですが、やんごとなき理由によってディスクのルートパスを動的に変える必要がある時があります(設計ミスかヒアリングミスを補うときなど、既存コードでガッツリ書かれているが変更があったなど)。このルートパスの切り替えは次の様にできます。
/** @var \Illuminate\Filesystem\FilesystemAdapter $storage */
$storage = Storage::disk('ストレージのディスクのキー');
/** @var \League\Flysystem\FilesystemInterface $driver */
$driver =$storage->getDriver();
// もしドライバーとそのアダプターがローカルのファイルシステムを取り扱うためのクラスであるならば
if ($driver instanceof Filesystem && ($adapter = $driver->getAdapter()) instanceof Local) {
// 新しいパスを必要な場所にセット
$adapter->setPathPrefix('ディスクの新しいルートディレクトリのパス');
}