filesystemとかいうやつ
先日、画像をアップロードしようとしたところ、laravelにはそういう機能があるらしいことを知りました。
->store
とかそういうやつ。
以前作ったやつではfwriteとかそんな感じでやった覚えがあるのですが、まあそういうのがあるならわざわざ自力で実装する理由もないですよね。
というわけで真似しようとしてみたのですが、ちょっとよくわからなくなりました。
わからんポイント
上記の記事で参考にした記事では、filesystemとかいうやつの設定を書き換えて、保存先を指定してました。
デフォルトで指定されるlocalのパスを、publicに変更する方法ですね。
まあ確かに、それで保存できるんですが、ひとつ問題が。
その場所を読み出す方法がわからないという。
もちろん直接指定する事はできますが、わざわざstoreとかしてるんだからgetとか使いたいのが人情です。
できたはできたけど
以下のようにすればとりあえず指定はできました。
pathには、storeの戻り値が格納されています。
{{ url(Storage::disk('local')->url($image->path)) }}
'disks' => [
'local' => [
'driver' => 'local',
// 前回変更した部分
// 'root' => storage_path('app'),
'root' => public_path('img'),
// 追加
'url' => env('APP_URL').'/img',
],
できたんですが……
そもそもlocalって書いてあるし、publicってのが別にあるみたいだし、なんていうか使い方間違えてるのでは……?
ってなったので調べてみました。
参考資料
ファイルストレージ 5.5 Laravel
それはそれは素晴らしい『Laravel』のファイルシステムについて語りたい | 東京上野のWeb制作会社LIG
読み書きする場合は(普通は)publicを使う?
あたりまえ体操とかするレベルで当たり前なんですがやはりpublicを使うっぽい雰囲気があります。
ただし準備は必要で、シンボリックリンクを作成する必要があるとのこと。
php artisan storage:link
でデフォルトなシンボリックリンクが作成されます。
public直下のstorageから、storage/app/publicを指定するリンクなので、それ以外に飛ばしたい場合は別途シンボリックリンクを作成する必要があります。
cd public
ln -s ../storage/app/public storage
デフォルトと同じシンボリックリンクの作成はこんな感じかな?
というわけで作法的にはプロジェクトファイル/storage/app/publicに保存されるのが正解のようです。
disks => public => rootですね。
で、urlを指定すると disks => public => urlで指定されているpublic/storageが指定される。
ブラウザからpublic/storageにアクセスすると、シンボリックリンクでstorage/app/publicに向き先が変わると。
書き方
呼び出し方は、localをpublicに変えるだけ。
{{ url(Storage::disk('public')->url($image->path)) }}
保存するときは、storeの引数にpublicの指定を追加してやる必要があるようです。
$image->store('', ['disk' => 'public']);
$image->storeAs('', 'hoge.jpg', ['disk' => 'public']);
実験
早速使ってみることにします。
前準備
まずはfilesystemを書き換えました。
'public' => [
'driver' => 'local',
// 'root' => storage_path('app/public'),
// 'url' => env('APP_URL').'/storage',
'root' => storage_path('app/public/img/upload'),
'url' => env('APP_URL').'/img/upload',
'visibility' => 'public',
],
次にシンボリックリンクを作成します。
それまで作成していたpublicのuploadフォルダには申し訳ありませんが消えてもらいます。
migrateもやり直します。
vagrant@homestead:~/code/Laravel$ cd public/img/
vagrant@homestead:~/code/Laravel/public/img$ ln -s ../../storage/app/public/img/upload upload
vagrant@homestead:~/code/Laravel/public/img$ ls -l
total 488
lrwxr-xr-x 1 vagrant vagrant 35 Jun 19 10:16 upload -> ../../storage/app/public/img/upload
保存処理
storeを変更し、向き先をpublicにしました。
$path = $e->store('', ['disk' => 'public']);
filesystemだとdisksだけどここはdiskなんですね……わかるような気はしますが紛らわしい。
というか間違えました。
ともあれ、これでpublicのrootであるstorage/app/public/img/upload
(無駄に深い)に保存されるようになりました。
読込処理
これについては前述のとおり、
{{ Storage::disk('public')->url($image->path) }}
でいけます。
filesystemの記載方法によりますが、publicのurlにはenv('APP_URL')
が使われていたためurl()
も不要でした。
そんな感じ?
ざっと調べただけなんで、理解が間違ってるかも……などと言い訳しつつ。
とりあえずそんな感じです。
s3とかはよくわからないです。