そうだ、そうだ、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に設定を追加します。
config/filesystems.php
'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 にエクスポートされたはずです。