修改 Laravel 的預設 public 路徑

E1發表於2018-09-06

想看解決辦法的直接看最後,以下為流水賬(

最近遇到個坑,就是自己寫著玩的專案上傳到虛擬共享主機做測試,blade 模板使用了 mix() 來載入 CSS 及 JS 結果開首頁就報錯,提示 mix-manifest.json 無法找到,因為我這臺虛擬共享主機寫死的 HTML 根目錄為 domains/my_domian/public_html,於是抱著儘量少折騰的心態,猜測 mix() 讀取的是 app/public 目錄,也沒多想直接把 mix() 改成了 asset()
行了,這回可以正常開啟首頁了。於是乎開啟後臺(使用 tcg/voyager 擴充套件),提示沒有軟連結,要求建立,點選建立以後又報錯提示:symlink(): No such file or directory 。我想還是找個一勞永逸的方法吧。
於是乎上 tcg/voyager 專案主頁看有沒有相似 issue ,瀏覽完了相似情況的解決方法,在我虛擬共享主機上都不適用,但是我看到一個關鍵,就是 symlink() 這個函式,建立軟連結的時候,先呼叫 public_path() 獲取 public 的目錄,看來找到了關鍵,只要查詢 public_path() 方法的預設返回值,應該就能修改 public 目錄預設路徑了,於是用 sublime text 發起在檔案中所搜,找到了擠出呼叫,並定位到了定義檔案在 Illuminate\Foundation\helpers.php ,然而並不是源頭,只有一句 app()->make('path.public') (後面字串拼接省略),再次在全檔案中搜尋 path.public ,定位到 Illuminate\Foundation\Application.php 中的

protected function bindPathsInContainer()
{
    ...
    $this->instance('path.public', $this->publicPath());
    ...
}

原來最終的源頭是 Illuminate\Foundation\Application.php 下的 publicPath()public 目錄就是在這裡拼接的:$this->basePath.DIRECTORY_SEPARATOR.'public';,把 'public' 改成 'public_html' 即可。當然最一勞永逸的方法就是購買一臺 vps (#貧窮的流淚熊貓頭)

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

相關文章