關於 `storage:link` Artisan 命令的一些思考

zhangbao發表於2017-08-11

在 Laravel 中,要訪問上傳到本地的檔案資源,需要先建立一個軟連線。使用 storage:link Artisan 命令,就可以快速建立這個軟連結。

# php artisan storage:link

命令執行完畢後,就會在專案裡多出一個 public/storage,這個 storage 就是一個軟連結,它指向 storage/app/public 目錄。

public/storage(軟連線) → storage/app/public

目錄樹結構是這樣的。

public/
├── storage(軟連線,指向目錄 `storage/app/public`)
├── css/
│   └── bootstrap.css
└── js/
    └── bootstrap.js

storage/
└── app/
    └── public/
        └── user-avatar.png

一、為何要建立軟連結?

專案根目錄下的 public 是一個特殊的目錄——存放可公共訪問的資源。就像你看到的,除了 storage 這個軟連結,還有 CSS 和 JS 檔案都放在這裡。如果你的域名是 my.app,那麼訪問這些資源的 URL 如下:

細心的你會發現,http://my.app/storage/user-avatar.png 實際訪問的檔案資源的伺服器地址是 /path/to/myapp/storage/app/public/user-avatar.png

如果上傳的資原始檔是儲存在本地的,Laravel 預設會放在 storage/app 裡面,這個目錄是不可見的,如果想要能公共訪問就必須暴露在專案根目錄下的 public 中,這就是建立軟連結的原因 。

二、Laravel 的選擇

Laravel 預設建立軟連結的方式已經提過。

public/storage → storage/app/public

storage/app/public 的意思很好理解,就是儲存在伺服器上,但是暴露給公共(public)使用的資源目錄。那麼 public/storage 呢,為什麼要這樣命名?下面是我的思考,假如不這麼命名,我們能用什麼命名方式?

2.1 第一種命名

public/public → storage/app/public

這樣的好處是軟連結 public 和被指向的目錄名一樣了,方便記憶。但是訪問資源的路徑變成:

有一個問題是,你能說 JS 和 CSS 不是 public 的嗎?所以這個 pass 掉。

2.2 第二種命名

public/uploads → storage/app/public

此時,訪問資源的路徑變成。

這容易有誤解——上傳的檔案資源都可以使用 http://my.app/uploads/ 的形式訪問到。

2.3 Laravel 的選擇

雖然

public/storage → storage/app/public

的選擇不如第一種命名方式方便記憶,但還是保持了某種程度上的語義且不容易誤解——

使用者訪問的是伺服器上 儲存 的資原始檔,而且這個資原始檔是可以公共訪問的。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章