はじめに

Laravelは、Frank de Jongeによる素晴らしいFlysystem PHPパッケージのおかげで、強力なファイルシステムの抽象化を提供します。Laravel Flysystemの統合は、ローカルファイルシステム、SFTP、およびAmazon S3で作業するためのシンプルなドライバーを提供します。さらに良いことに、APIは各システムで同じであるため、ローカル開発マシンと本番サーバー間でこれらのストレージオプションを簡単に切り替えることができます。

設定

Laravelのファイルシステム設定ファイルはconfig/filesystems.phpにあります。このファイル内で、すべてのファイルシステム「ディスク」を設定できます。各ディスクは特定のストレージドライバーとストレージ場所を表します。サポートされている各ドライバーの例の設定が設定ファイルに含まれているため、ストレージの好みや資格情報を反映するように設定を変更できます。

  1. 好きなだけ多くのディスクを設定でき、同じドライバーを使用する複数のディスクを持つこともできます。
  2. <a name="the-local-driver"></a>
  3. ### ローカルドライバー
  4. `````local`````ドライバーを使用する場合、すべてのファイル操作は`````root`````設定ファイルで定義されたディレクトリに対して相対的です。デフォルトでは、この値は`````storage/app`````ディレクトリに設定されています。したがって、次のメソッドは`````storage/app/example.txt`````に書き込みます:
  5. ``````php
  6. use Illuminate\Support\Facades\Storage;
  7. Storage::disk('local')->put('example.txt', 'Contents');
  8. `

パブリックディスク

  1. これらのファイルをWebからアクセス可能にするには、`````public/storage`````から`````storage/app/public`````へのシンボリックリンクを作成する必要があります。このフォルダーの規則を利用することで、公開アクセス可能なファイルを1つのディレクトリに保持し、[Envoyer](https://envoyer.io)のようなゼロダウンタイムデプロイメントシステムを使用する際に、デプロイメント間で簡単に共有できます。
  2. シンボリックリンクを作成するには、`````storage:link````` Artisanコマンドを使用できます:
  3. ``````shell
  4. php artisan storage:link
  5. `

ファイルが保存され、シンボリックリンクが作成されたら、assetヘルパーを使用してファイルへのURLを作成できます:

  1. echo asset('storage/file.txt');
  1. ``````php
  2. 'links' => [
  3. public_path('storage') => storage_path('app/public'),
  4. public_path('images') => storage_path('app/images'),
  5. ],
  6. `
  1. ``````shell
  2. php artisan storage:unlink
  3. `

ドライバーの前提条件

S3ドライバーの設定

S3ドライバーを使用する前に、Composerパッケージマネージャーを介してFlysystem S3パッケージをインストールする必要があります:

  1. composer require league/flysystem-aws-s3-v3 "^3.0" --with-all-dependencies

S3ディスク設定配列は、config/filesystems.php設定ファイルにあります。通常、config/filesystems.php設定ファイルで参照される次の環境変数を使用して、S3情報と資格情報を設定する必要があります:

  1. AWS_ACCESS_KEY_ID=<your-key-id>
  2. AWS_SECRET_ACCESS_KEY=<your-secret-access-key>
  3. AWS_DEFAULT_REGION=us-east-1
  4. AWS_BUCKET=<your-bucket-name>
  5. AWS_USE_PATH_STYLE_ENDPOINT=false

便利なことに、これらの環境変数はAWS CLIで使用される命名規則と一致します。

FTPドライバーの設定

FTPドライバーを使用する前に、Composerパッケージマネージャーを介してFlysystem FTPパッケージをインストールする必要があります:

  1. composer require league/flysystem-ftp "^3.0"

LaravelのFlysystem統合はFTPと非常に相性が良いですが、フレームワークのデフォルトconfig/filesystems.php設定ファイルにはサンプル設定が含まれていません。FTPファイルシステムを設定する必要がある場合は、以下の設定例を使用できます:

  1. 'ftp' => [
  2. 'driver' => 'ftp',
  3. 'host' => env('FTP_HOST'),
  4. 'username' => env('FTP_USERNAME'),
  5. 'password' => env('FTP_PASSWORD'),
  6. // Optional FTP Settings...
  7. // 'port' => env('FTP_PORT', 21),
  8. // 'root' => env('FTP_ROOT'),
  9. // 'passive' => true,
  10. // 'ssl' => true,
  11. // 'timeout' => 30,
  12. ],

SFTPドライバーの設定

SFTPドライバーを使用する前に、Composerパッケージマネージャーを介してFlysystem SFTPパッケージをインストールする必要があります:

  1. composer require league/flysystem-sftp-v3 "^3.0"

LaravelのFlysystem統合はSFTPと非常に相性が良いですが、フレームワークのデフォルトconfig/filesystems.php設定ファイルにはサンプル設定が含まれていません。SFTPファイルシステムを設定する必要がある場合は、以下の設定例を使用できます:

  1. 'sftp' => [
  2. 'driver' => 'sftp',
  3. 'host' => env('SFTP_HOST'),
  4. // Settings for basic authentication...
  5. 'username' => env('SFTP_USERNAME'),
  6. 'password' => env('SFTP_PASSWORD'),
  7. // Settings for SSH key based authentication with encryption password...
  8. 'privateKey' => env('SFTP_PRIVATE_KEY'),
  9. 'passphrase' => env('SFTP_PASSPHRASE'),
  10. // Settings for file / directory permissions...
  11. 'visibility' => 'private', // `private` = 0600, `public` = 0644
  12. 'directory_visibility' => 'private', // `private` = 0700, `public` = 0755
  13. // Optional SFTP Settings...
  14. // 'hostFingerprint' => env('SFTP_HOST_FINGERPRINT'),
  15. // 'maxTries' => 4,
  16. // 'passphrase' => env('SFTP_PASSPHRASE'),
  17. // 'port' => env('SFTP_PORT', 22),
  18. // 'root' => env('SFTP_ROOT', ''),
  19. // 'timeout' => 30,
  20. // 'useAgent' => true,
  21. ],

スコープ付きおよび読み取り専用ファイルシステム

スコープ付きディスクを使用すると、すべてのパスが指定されたパスプレフィックスで自動的にプレフィックスされるファイルシステムを定義できます。スコープ付きファイルシステムディスクを作成する前に、Composerパッケージマネージャーを介して追加のFlysystemパッケージをインストールする必要があります:

  1. composer require league/flysystem-path-prefixing "^3.0"
  1. ``````php
  2. 's3-videos' => [
  3. 'driver' => 'scoped',
  4. 'disk' => 's3',
  5. 'prefix' => 'path/to/videos',
  6. ],
  7. `

「読み取り専用」ディスクを使用すると、書き込み操作を許可しないファイルシステムディスクを作成できます。read-only設定オプションを使用する前に、Composerパッケージマネージャーを介して追加のFlysystemパッケージをインストールする必要があります:

  1. composer require league/flysystem-read-only "^3.0"

次に、ディスクの設定配列の1つ以上にread-only設定オプションを含めることができます:

  1. 's3-videos' => [
  2. 'driver' => 's3',
  3. // ...
  4. 'read-only' => true,
  5. ],

Amazon S3互換ファイルシステム

デフォルトでは、アプリケーションのfilesystems設定ファイルにはs3ディスクの設定が含まれています。このディスクを使用してAmazon S3と対話するだけでなく、MinIODigitalOcean SpacesなどのS3互換ファイルストレージサービスと対話するためにも使用できます。

通常、使用するサービスの資格情報に一致するようにディスクの資格情報を更新した後、endpoint設定オプションの値を更新するだけで済みます。このオプションの値は通常、AWS_ENDPOINT環境変数を介して定義されます:

  1. 'endpoint' => env('AWS_ENDPOINT', 'https://minio:9000'),

MinIO

LaravelのFlysystem統合がMinIOを使用する際に適切なURLを生成するには、AWS_URL環境変数を定義して、アプリケーションのローカルURLとバケット名をURLパスに含める必要があります:

  1. AWS_URL=http://localhost:9000/local
  1. <a name="obtaining-disk-instances"></a>
  2. ## ディスクインスタンスの取得
  3. `````Storage`````ファサードを使用して、設定されたディスクのいずれかと対話できます。たとえば、ファサードの`````put`````メソッドを使用して、デフォルトディスクにアバターを保存できます。`````Storage`````ファサードで`````disk`````メソッドを最初に呼び出さずにメソッドを呼び出すと、そのメソッドは自動的にデフォルトディスクに渡されます:
  4. ``````php
  5. use Illuminate\Support\Facades\Storage;
  6. Storage::put('avatars/1', $content);
  7. `

アプリケーションが複数のディスクと対話する場合、Storageファサードのdiskメソッドを使用して特定のディスクのファイルで作業できます:

  1. Storage::disk('s3')->put('avatars/1', $content);

オンデマンドディスク

時には、アプリケーションのfilesystems設定ファイルにその設定が実際に存在しない状態で、指定された設定を使用してランタイムでディスクを作成したい場合があります。これを実現するには、Storageファサードのbuildメソッドに設定配列を渡すことができます:

  1. use Illuminate\Support\Facades\Storage;
  2. $disk = Storage::build([
  3. 'driver' => 'local',
  4. 'root' => '/path/to/root',
  5. ]);
  6. $disk->put('image.jpg', $content);

ファイルの取得

  1. ``````php
  2. $contents = Storage::get('file.jpg');
  3. `

取得しているファイルがJSONを含む場合、jsonメソッドを使用してファイルを取得し、その内容をデコードできます:

  1. $orders = Storage::json('orders.json');
  1. ``````php
  2. if (Storage::disk('s3')->exists('file.jpg')) {
  3. // ...
  4. }
  5. `
  1. ``````php
  2. if (Storage::disk('s3')->missing('file.jpg')) {
  3. // ...
  4. }
  5. `

ファイルのダウンロード

  1. ``````php
  2. return Storage::download('file.jpg');
  3. return Storage::download('file.jpg', $name, $headers);
  4. `

ファイルURL

  1. ``````php
  2. use Illuminate\Support\Facades\Storage;
  3. $url = Storage::url('file.jpg');
  4. `
  1. `````local`````ドライバーを使用する場合、`````url`````の戻り値はURLエンコードされません。このため、常に有効なURLを作成する名前を使用してファイルを保存することをお勧めします。
  2. <a name="url-host-customization"></a>
  3. #### URLホストのカスタマイズ
  4. `````Storage`````ファサードを使用して生成されたURLのホストを変更したい場合は、ディスクの設定配列に`````url`````オプションを追加または変更できます:
  5. ``````php
  6. 'public' => [
  7. 'driver' => 'local',
  8. 'root' => storage_path('app/public'),
  9. 'url' => env('APP_URL').'/storage',
  10. 'visibility' => 'public',
  11. 'throw' => false,
  12. ],
  13. `

一時URL

  1. ``````php
  2. use Illuminate\Support\Facades\Storage;
  3. $url = Storage::temporaryUrl(
  4. 'file.jpg', now()->addMinutes(5)
  5. );
  6. `

ローカル一時URLの有効化

一時URLのサポートがlocalドライバーに導入される前にアプリケーションの開発を開始した場合、ローカル一時URLを有効にする必要があるかもしれません。そのためには、serveオプションをlocalディスクの設定配列にconfig/filesystems.php設定ファイル内で追加します:

  1. 'local' => [
  2. 'driver' => 'local',
  3. 'root' => storage_path('app/private'),
  4. 'serve' => true,
  5. 'throw' => false,
  6. ],

S3リクエストパラメータ

追加のS3リクエストパラメータを指定する必要がある場合、temporaryUrlメソッドの第3引数としてリクエストパラメータの配列を渡すことができます:

  1. $url = Storage::temporaryUrl(
  2. 'file.jpg',
  3. now()->addMinutes(5),
  4. [
  5. 'ResponseContentType' => 'application/octet-stream',
  6. 'ResponseContentDisposition' => 'attachment; filename=file2.jpg',
  7. ]
  8. );

一時URLのカスタマイズ

特定のストレージディスクの一時URLの作成方法をカスタマイズする必要がある場合、buildTemporaryUrlsUsingメソッドを使用できます。たとえば、通常一時URLをサポートしないディスクを介して保存されたファイルをダウンロードできるコントローラーがある場合に便利です。通常、このメソッドはサービスプロバイダーのbootメソッドから呼び出されるべきです:

  1. <?php
  2. namespace App\Providers;
  3. use DateTime;
  4. use Illuminate\Support\Facades\Storage;
  5. use Illuminate\Support\Facades\URL;
  6. use Illuminate\Support\ServiceProvider;
  7. class AppServiceProvider extends ServiceProvider
  8. {
  9. /**
  10. * Bootstrap any application services.
  11. */
  12. public function boot(): void
  13. {
  14. Storage::disk('local')->buildTemporaryUrlsUsing(
  15. function (string $path, DateTime $expiration, array $options) {
  16. return URL::temporarySignedRoute(
  17. 'files.download',
  18. $expiration,
  19. array_merge($options, ['path' => $path])
  20. );
  21. }
  22. );
  23. }
  24. }

一時アップロードURL

一時アップロードURLを生成する機能は、s3ドライバーでのみサポートされています。

クライアント側アプリケーションからファイルを直接アップロードするために使用できる一時URLを生成する必要がある場合、temporaryUploadUrlメソッドを使用できます。このメソッドは、パスとURLが期限切れになる時期を指定するDateTimeインスタンスを受け入れます。temporaryUploadUrlメソッドは、アップロードURLとアップロードリクエストに含めるべきヘッダーを分解できる連想配列を返します:

  1. use Illuminate\Support\Facades\Storage;
  2. ['url' => $url, 'headers' => $headers] = Storage::temporaryUploadUrl(
  3. 'file.jpg', now()->addMinutes(5)
  4. );

このメソッドは、クライアント側アプリケーションがAmazon S3などのクラウドストレージシステムにファイルを直接アップロードする必要があるサーバーレス環境で主に便利です。

ファイルメタデータ

ファイルの読み書きに加えて、Laravelはファイル自体に関する情報も提供できます。たとえば、sizeメソッドを使用して、ファイルのサイズをバイト単位で取得できます:

  1. use Illuminate\Support\Facades\Storage;
  2. $size = Storage::size('file.jpg');
  1. ``````php
  2. $time = Storage::lastModified('file.jpg');
  3. `

特定のファイルのMIMEタイプは、mimeTypeメソッドを介して取得できます:

  1. $mime = Storage::mimeType('file.jpg');

ファイルパス

  1. ``````php
  2. use Illuminate\Support\Facades\Storage;
  3. $path = Storage::path('file.jpg');
  4. `

ファイルの保存

  1. ``````php
  2. use Illuminate\Support\Facades\Storage;
  3. Storage::put('file.jpg', $contents);
  4. Storage::put('file.jpg', $resource);
  5. `

書き込み失敗

もしputメソッド(または他の「書き込み」操作)がファイルをディスクに書き込めない場合、falseが返されます:

  1. if (! Storage::put('file.jpg', $contents)) {
  2. // The file could not be written to disk...
  3. }

必要に応じて、ファイルシステムディスクの設定配列内にthrowオプションを定義できます。このオプションがtrueとして定義されている場合、putのような「書き込み」メソッドは、書き込み操作が失敗したときにLeague\Flysystem\UnableToWriteFileのインスタンスをスローします:

  1. 'public' => [
  2. 'driver' => 'local',
  3. // ...
  4. 'throw' => true,
  5. ],

ファイルへの前置きおよび後置き

  1. ``````php
  2. Storage::prepend('file.log', 'Prepended Text');
  3. Storage::append('file.log', 'Appended Text');
  4. `

ファイルのコピーと移動

  1. ``````php
  2. Storage::copy('old/file.jpg', 'new/file.jpg');
  3. Storage::move('old/file.jpg', 'new/file.jpg');
  4. `

自動ストリーミング

ストレージへのファイルのストリーミングは、メモリ使用量を大幅に削減します。Laravelが指定されたファイルをストレージ位置に自動的にストリーミングするようにしたい場合、putFileまたはputFileAsメソッドを使用できます。このメソッドは、Illuminate\Http\FileまたはIlluminate\Http\UploadedFileインスタンスを受け入れ、ファイルを希望の場所に自動的にストリーミングします:

  1. use Illuminate\Http\File;
  2. use Illuminate\Support\Facades\Storage;
  3. // Automatically generate a unique ID for filename...
  4. $path = Storage::putFile('photos', new File('/path/to/photo'));
  5. // Manually specify a filename...
  6. $path = Storage::putFileAs('photos', new File('/path/to/photo'), 'photo.jpg');
  1. `````putFile`````および`````putFileAs`````メソッドも、保存されたファイルの「可視性」を指定する引数を受け入れます。これは、Amazon S3などのクラウドディスクにファイルを保存し、生成されたURLを介してファイルを公開アクセス可能にしたい場合に特に便利です:
  2. ``````php
  3. Storage::putFile('photos', new File('/path/to/photo'), 'public');
  4. `

ファイルアップロード

Webアプリケーションにおいて、ファイルを保存する最も一般的なユースケースの1つは、ユーザーがアップロードしたファイル(写真や文書など)を保存することです。Laravelは、アップロードされたファイルをstoreメソッドを使用して非常に簡単に保存できます。アップロードされたファイルを保存したいパスでstoreメソッドを呼び出します:

  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. class UserAvatarController extends Controller
  6. {
  7. /**
  8. * Update the avatar for the user.
  9. */
  10. public function update(Request $request): string
  11. {
  12. $path = $request->file('avatar')->store('avatars');
  13. return $path;
  14. }
  15. }

この例について注意すべき重要な点がいくつかあります。ディレクトリ名のみを指定し、ファイル名を指定しなかったことに注意してください。デフォルトでは、storeメソッドはファイル名として使用する一意のIDを生成します。ファイルの拡張子は、ファイルのMIMEタイプを調べることで決定されます。ファイルへのパスはstoreメソッドによって返されるため、生成されたファイル名を含むパスをデータベースに保存できます。

  1. ``````php
  2. $path = Storage::putFile('avatars', $request->file('avatar'));
  3. `

ファイル名の指定

保存されたファイルに自動的にファイル名が割り当てられないようにしたい場合、storeAsメソッドを使用できます。このメソッドは、パス、ファイル名、および(オプションの)ディスクを引数として受け取ります:

  1. $path = $request->file('avatar')->storeAs(
  2. 'avatars', $request->user()->id
  3. );
  1. ``````php
  2. $path = Storage::putFileAs(
  3. 'avatars', $request->file('avatar'), $request->user()->id
  4. );
  5. `

印刷不可能で無効なUnicode文字は、ファイルパスから自動的に削除されます。したがって、Laravelのファイルストレージメソッドに渡す前にファイルパスをサニタイズすることをお勧めします。ファイルパスはLeague\Flysystem\WhitespacePathNormalizer::normalizePathメソッドを使用して正規化されます。

ディスクの指定

デフォルトでは、このアップロードされたファイルのstoreメソッドは、デフォルトディスクを使用します。別のディスクを指定したい場合は、storeメソッドの第2引数としてディスク名を渡します:

  1. $path = $request->file('avatar')->store(
  2. 'avatars/'.$request->user()->id, 's3'
  3. );
  1. ``````php
  2. $path = $request->file('avatar')->storeAs(
  3. 'avatars',
  4. $request->user()->id,
  5. 's3'
  6. );
  7. `

他のアップロードファイル情報

アップロードされたファイルの元の名前と拡張子を取得したい場合、getClientOriginalNameおよびgetClientOriginalExtensionメソッドを使用できます:

  1. $file = $request->file('avatar');
  2. $name = $file->getClientOriginalName();
  3. $extension = $file->getClientOriginalExtension();

ただし、getClientOriginalNameおよびgetClientOriginalExtensionメソッドは安全ではないと見なされるため、ファイル名や拡張子が悪意のあるユーザーによって改ざんされる可能性があります。このため、通常はhashNameおよびextensionメソッドを使用して、指定されたファイルアップロードの名前と拡張子を取得することをお勧めします:

  1. $file = $request->file('avatar');
  2. $name = $file->hashName(); // Generate a unique, random name...
  3. $extension = $file->extension(); // Determine the file's extension based on the file's MIME type...

ファイルの可視性

LaravelのFlysystem統合において、「可視性」は複数のプラットフォームにわたるファイル権限の抽象化です。ファイルはpublicまたはprivateとして宣言できます。ファイルがpublicとして宣言されると、そのファイルは一般的に他の人がアクセスできるべきであることを示しています。たとえば、S3ドライバーを使用する場合、publicファイルのURLを取得できます。

ファイルを書き込む際にputメソッドを介して可視性を設定できます:

  1. use Illuminate\Support\Facades\Storage;
  2. Storage::put('file.jpg', $contents, 'public');

ファイルがすでに保存されている場合、その可視性はgetVisibilityおよびsetVisibilityメソッドを介して取得および設定できます:

  1. $visibility = Storage::getVisibility('file.jpg');
  2. Storage::setVisibility('file.jpg', 'public');

アップロードされたファイルと対話する際には、storePubliclyおよびstorePubliclyAsメソッドを使用して、public可視性でアップロードされたファイルを保存できます:

  1. $path = $request->file('avatar')->storePublicly('avatars', 's3');
  2. $path = $request->file('avatar')->storePubliclyAs(
  3. 'avatars',
  4. $request->user()->id,
  5. 's3'
  6. );

ローカルファイルと可視性

localドライバーを使用する場合、public 可視性はディレクトリの0755権限およびファイルの0644権限に変換されます。アプリケーションのfilesystems設定ファイルで権限マッピングを変更できます:

  1. 'local' => [
  2. 'driver' => 'local',
  3. 'root' => storage_path('app'),
  4. 'permissions' => [
  5. 'file' => [
  6. 'public' => 0644,
  7. 'private' => 0600,
  8. ],
  9. 'dir' => [
  10. 'public' => 0755,
  11. 'private' => 0700,
  12. ],
  13. ],
  14. 'throw' => false,
  15. ],

ファイルの削除

  1. ``````php
  2. use Illuminate\Support\Facades\Storage;
  3. Storage::delete('file.jpg');
  4. Storage::delete(['file.jpg', 'file2.jpg']);
  5. `

必要に応じて、ファイルを削除するディスクを指定できます:

  1. use Illuminate\Support\Facades\Storage;
  2. Storage::disk('s3')->delete('path/file.jpg');

ディレクトリ

ディレクトリ内のすべてのファイルを取得

  1. ``````php
  2. use Illuminate\Support\Facades\Storage;
  3. $files = Storage::files($directory);
  4. $files = Storage::allFiles($directory);
  5. `

ディレクトリ内のすべてのディレクトリを取得

  1. ``````php
  2. $directories = Storage::directories($directory);
  3. $directories = Storage::allDirectories($directory);
  4. `

ディレクトリの作成

  1. ``````php
  2. Storage::makeDirectory($directory);
  3. `

ディレクトリの削除

最後に、deleteDirectoryメソッドを使用して、ディレクトリとそのすべてのファイルを削除できます:

  1. Storage::deleteDirectory($directory);

テスト

  1. ``````php
  2. <?php
  3. use Illuminate\Http\UploadedFile;
  4. use Illuminate\Support\Facades\Storage;
  5. test('albums can be uploaded', function () {
  6. Storage::fake('photos');
  7. $response = $this->json('POST', '/photos', [
  8. UploadedFile::fake()->image('photo1.jpg'),
  9. UploadedFile::fake()->image('photo2.jpg')
  10. ]);
  11. // Assert one or more files were stored...
  12. Storage::disk('photos')->assertExists('photo1.jpg');
  13. Storage::disk('photos')->assertExists(['photo1.jpg', 'photo2.jpg']);
  14. // Assert one or more files were not stored...
  15. Storage::disk('photos')->assertMissing('missing.jpg');
  16. Storage::disk('photos')->assertMissing(['missing.jpg', 'non-existing.jpg']);
  17. // Assert that a given directory is empty...
  18. Storage::disk('photos')->assertDirectoryEmpty('/wallpapers');
  19. });
  20. `
  1. <?php
  2. namespace Tests\Feature;
  3. use Illuminate\Http\UploadedFile;
  4. use Illuminate\Support\Facades\Storage;
  5. use Tests\TestCase;
  6. class ExampleTest extends TestCase
  7. {
  8. public function test_albums_can_be_uploaded(): void
  9. {
  10. Storage::fake('photos');
  11. $response = $this->json('POST', '/photos', [
  12. UploadedFile::fake()->image('photo1.jpg'),
  13. UploadedFile::fake()->image('photo2.jpg')
  14. ]);
  15. // Assert one or more files were stored...
  16. Storage::disk('photos')->assertExists('photo1.jpg');
  17. Storage::disk('photos')->assertExists(['photo1.jpg', 'photo2.jpg']);
  18. // Assert one or more files were not stored...
  19. Storage::disk('photos')->assertMissing('missing.jpg');
  20. Storage::disk('photos')->assertMissing(['missing.jpg', 'non-existing.jpg']);
  21. // Assert that a given directory is empty...
  22. Storage::disk('photos')->assertDirectoryEmpty('/wallpapers');
  23. }
  24. }

デフォルトでは、fakeメソッドは一時ディレクトリ内のすべてのファイルを削除します。これらのファイルを保持したい場合は、代わりに「persistentFake」メソッドを使用できます。ファイルアップロードのテストに関する詳細は、HTTPテストドキュメントのファイルアップロードに関する情報を参照してください。

  1. <a name="custom-filesystems"></a>
  2. ## カスタムファイルシステム
  3. LaravelのFlysystem統合は、いくつかの「ドライバー」を標準でサポートしていますが、Flysystemはこれに限定されず、多くの他のストレージシステム用のアダプターがあります。Laravelアプリケーションでこれらの追加アダプターの1つを使用したい場合は、カスタムドライバーを作成できます。
  4. カスタムファイルシステムを定義するには、Flysystemアダプターが必要です。コミュニティが管理するDropboxアダプターをプロジェクトに追加しましょう:
  5. ``````shell
  6. composer require spatie/flysystem-dropbox
  7. `

次に、アプリケーションのサービスプロバイダーbootメソッド内でドライバーを登録できます。これを実現するには、Storageファサードのextendメソッドを使用します:

  1. <?php
  2. namespace App\Providers;
  3. use Illuminate\Contracts\Foundation\Application;
  4. use Illuminate\Filesystem\FilesystemAdapter;
  5. use Illuminate\Support\Facades\Storage;
  6. use Illuminate\Support\ServiceProvider;
  7. use League\Flysystem\Filesystem;
  8. use Spatie\Dropbox\Client as DropboxClient;
  9. use Spatie\FlysystemDropbox\DropboxAdapter;
  10. class AppServiceProvider extends ServiceProvider
  11. {
  12. /**
  13. * Register any application services.
  14. */
  15. public function register(): void
  16. {
  17. // ...
  18. }
  19. /**
  20. * Bootstrap any application services.
  21. */
  22. public function boot(): void
  23. {
  24. Storage::extend('dropbox', function (Application $app, array $config) {
  25. $adapter = new DropboxAdapter(new DropboxClient(
  26. $config['authorization_token']
  27. ));
  28. return new FilesystemAdapter(
  29. new Filesystem($adapter, $config),
  30. $adapter,
  31. $config
  32. );
  33. });
  34. }
  35. }

extendメソッドの最初の引数はドライバーの名前で、2番目は$appおよび$config変数を受け取るクロージャです。クロージャはIlluminate\Filesystem\FilesystemAdapterのインスタンスを返す必要があります。$config変数には、指定されたディスクのconfig/filesystems.phpで定義された値が含まれています。

拡張のサービスプロバイダーを作成して登録したら、dropboxドライバーをconfig/filesystems.php設定ファイルで使用できます。