SSHできないサーバでLaravel用のシンボリックリンクを作成する

Laravel,PHP

Laravel8で画像のアップロード機能を作っています

Laravelでは、ユーザがアップロードした画像はStorageフォルダに格納されますが、Storage/app/publicディレクトリにある画像にユーザがアクセスするにはpublicディレクトリにシンボリックを貼る必要があります

シンボリックリンクを貼りたい場所

こういう感じでシンボリックリンクを作りたい!
| - app
| - config
| - database
| - public
  | - storage ← ここにシンボリックリンクを貼って、image.jpgが見れるようにしたい
| - resources
| - routes
| - storage
  | - app
    | - public
      | - image.jpg ← ユーザがアップロードした画像
| - vendor

上のシンボリックリンクを貼ることで、ユーザは、

http://hoge/storage/image.jpg

というURLで、アップロードした画像を見ることができるようになります

まあ、普通はHTMLのIMGタグなんかで表示しますけどね

<div>
  <img src='http://hoge/storage/image.jpg'>
</div>

シンボリックリンクをはる

Laravelでシンボリックリンクを貼るコマンド

> php artisan storage:link

The [/Applications/hoge/public/storage] link has been connected to [/Applications/hoge/storage/app/public].
The links have been created.

Laravelでは、このシンボリックリンクを貼るためのコマンドがあります

が、僕が利用してるスターサーバーみたいなレンタルサーバーの場合、SSHが利用できないのでサーバ側でシンボリックリンクを貼ることができません

そこで、PHPのsymlinkコマンドを使います

PHPでシンボリックリンクを貼る

symlink('シンボリックリンクのリンク元', 'シンボリックリンクを貼るパス');

こんな感じで、PHPメソッドを実行することでSSHからコマンドを叩くことなくシンボリックリンクを作成することができます。

symlink(storage_path() . '/app/public', public_path() . '/storage');

僕は適当なコントローラーを使って、こんな感じでsymlinkを実行しました。

もちろんコントローラーのある場所とリンクを貼りたいディレクトリは異なるので、相対パスで指定してます

第一引数の「storage_path() . '/app/public’」、

第二引数の「public_path() . '/storage’」、はそれぞれ以下に当たります

| - app
| - config
| - database
| - public
  | - storage ← 第二引数の「public_path() . '/storage'」はここに該当
| - resources
| - routes
| - storage
  | - app
    | - public
      | - image.jpg ← 第一引数の「storage_path() . '/app/public'」はここに該当
| - vendor