そうだ、そうだ、Laravel Excelを使ってみよう(3)日付のフォーマットの続きです。

ファイルの保存先を指定する

デフォルトの保存先

前回までエクスポートしたファイルは storage/app 配下に出力されました。この出力先はconfig/filesystems.phpのdefaultに指定されたdiskに基づいています。初期設定ではdefaultにlocalが指定されており、localの設定を確認するとrootにstorage/appが指定されていますね。

...
'default' => env('FILESYSTEM_DRIVER', 'local'),
...
'disks' => [
    'local' => [
        'driver' => 'local',
        'root' => storage_path('app'),
    ],
...

デフォルトの保存先がどこの設定を参照しているのか確認できたところで本題、エクスポートの保存先を変更してみます。

相対パスで指定する

もし、storage/app/public 配下にエクスポートしたい場合は以下のように、storeメソッドの第2引数に相対パスを指定することで変更できます。

Psy Shell v0.10.6 (PHP 7.2.34 — cli) by Justin Hileman
>>> use App\Exports\PurchaseHistoryExport;
>>> Excel::store(new PurchaseHistoryExport, 'public/purchase_history.xlsx');
=> true

storage/app 以外のディレクトリ、例えば storage/exports などに出力したい場合はどうでしょうか?
試しに相対パスで指定してみます。

>>> Excel::store(new PurchaseHistoryExport, '../exports/purchase_history.xlsx');
LogicException with message 'Path is outside of the defined root, path: [../exports/purchase_history.xlsx]'

エラーが出力されてしまいました。

冒頭で触れた通り、config/filesystems.php のdefaultに指定されたdisk(初期設定ではlocal)に基づいています。よって、そのrootである storage/app 外のパスは指定できないみたいです。

では、どうするか?

Diskで指定する

diskの設定を追加しstoreメソッドに渡すことで、出力先のディレクトリを自由に変更できます。公式ドキュメントだとStoring exports on disk のCustom disks欄に説明が記載されてます。

まず、config/filesystems.php のdisksに設定を追加します。

'disks' => [
    ...
    'exports' => [
        'driver' => 'local',
        'root' => storage_path('exports'), // ←出力先のディレクトリパスを指定
    ],
],

そして、storeメソッドの第三引数に追加した設定のkeyを指定します。configに追加した設定を読み込ませるために、tinkerの再起動が必要ですのでご注意を!

Psy Shell v0.10.6 (PHP 7.2.34 — cli) by Justin Hileman
>>> use App\Exports\PurchaseHistoryExport;
>>> Excel::store(new PurchaseHistoryExport, 'purchase_history.xlsx', 'exports');
=> true

storage/exports/purchase_history.xlsx にエクスポートされたはずです。

まとめ

色々な分野でデータ活用が見直されている昨今、出力するデータも多岐に渡ると思います。とはいえ、出力先毎にdisk設定を追加していくとconfig/filesystems.phpが肥大化してしまい、管理しずらくなります。よって、disk設定と相対パス指定の両方をバランスよく組み合わせて運用していくのが良さそうです。

余談

当初、出力先を変更する方法について理解が進まず、ドキュメントとにらめっこしたり、ソースを追ってみたりしてました。最終的にGitHub上の過去のIssueから相対パスで指定できることを知り、diskの設定追加が必要なケースについても把握できました。このパッケージはGitHub上でのやり取りが盛んに行われているので行き詰まった時は是非そちらを参照してみて下さい。

GitHub: https://github.com/maatwebsite/Laravel-Excel

By hikaru