【Laravel】FileファザードとStorageファザードって何が違うの?

FileファザードとStorageファザード

Laravelでファイル操作したい!ってなると File:: Storage:: とかあって混乱するよぉ><
となったのでまとめました〜

(ここ間違ってるよ!とか表現この方が良いのでは?などあったら教えてください!)

File facade

・Storage facadeのスリム版のようなもの
(the native filesystem implementation(?))
・ディスクの指定はサポートしないのでlocalのみで使える
・filesystemのメソッド使える
・アプリケーションルートディレクトリに関連付けられる
 (アプリケーションルートディレクトリからの相対パス

Storage facade

・filesystemのメソッド使える
・ディスクの指定(切り替え)できるfilesystems使える
・filesystems.phpで設定されたディレクトリに関連付けられる
 (filesystems.phpで設定されたディレクトリからの相対パス、指定なしだとデフォルの設定が適用されます)


Storageファザードはいろいろできる便利なやつで、
Fileファザードはちょこっとなにかしたいときに使える良いやつ
という感じでしょうか(?)

Fileファザードは下記のような感じで登録されていました
以下は一部抜粋です!


/vendor/laravel/framework/src/Illuminate/Support/Facades/File.php

    protected static function getFacadeAccessor()
    {
        return 'files';
    }

/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemServiceProvider.php

    /**
     * Register the native filesystem implementation.
     *
     * @return void
     */
    protected function registerNativeFilesystem()
    {
        $this->app->singleton('files', function () {
            return new Filesystem;
        });
    }

Storageファザードと「ディスク」

WEBアプリケーションでは、ファイルをアップロードなどの操作を行っていると、
パス管理が複雑になって、管理が難しくなったりますよね。
ということで、それらを良い感じに管理するパッケージが組み込まれています。そうLaravelならね。

LaravelはFrank de Jongeさんが作成した拝みたいほど素晴らしい、抽象ファイルシステムであるFlysystem PHPパッケージを提供しています。LaravelとFlysystemの統合によりローカルのフイルシステム、Amazon S3、Rackspaceクラウドストレージを操作できる、シンプルなドライバが提供できました。更に素晴らしいことにそれぞれのシステムに対し同じAPIを使用しているため、ストレージをとても簡単に変更できるのです。

ファイルストレージ 5.7 Laravel

(個人的にこの「拝みたいほど素晴らしい」という表現好きなのですが、原文では「thanks to the wonderful Flysystem PHP package by Frank de Jonge.」でした)

ストレージドライバや保存場所のディレクトリなどの設定情報は「ディスク」という概念で定義されています。
実際に、config/filesystems.phpを見ると、Laravelがサポート済みのドライバそれぞれの設定例が用意されているのが確認できますね。
config/filesystems.php

    'disks' => [
        'local' => [
            'driver' => 'local',
            'root' => storage_path('app'),
        ],
        'public' => [
            'driver' => 'local',
            'root' => storage_path('app/public'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
        ],
        's3' => [
            'driver' => 's3',
            'key' => env('AWS_KEY'),
            'secret' => env('AWS_SECRET'),
            'region' => env('AWS_REGION'),
            'bucket' => env('AWS_BUCKET'),
        ],
    ],


ドライバーがlocalの設定('driver' => 'local')には、「public」と「local」がありますが、
これらは保存場所のディレクトリが異なります。
「local」では、保存先のルートディレクトリが、「 'root' => storage_path('app')」になっています。
つまり、「/storage/app」配下に保存ディレクトリが指定されているのですね。
主に、外部から非公開にしたいファイルなどを表示するときに保存します。

一方で、「public」では、保存先のルートディレクトリが、「'root' => storage_path('app/public')」になっています。
こちらは、「/storage/app/public」配下に保存ディレクトリが指定されているのですね。
php artisan storage:link」というコマンドを打つことで、
「storage/app/public」へシンボリックリンクを張ることができ、外部からのアクセスが可能になります。

このような、「ディスク」を切り替えるだけで、様々な設定でファイル操作が可能になるのですね〜すてきですねえ〜

また拝みたいほど素晴らしいfilesystemのメソッド達をまとめた記事とか書きたいです!