10分鐘掌握Laravel資料夾結構

10分鐘掌握Laravel資料夾結構

預設的 Laravel 專案結構出發點是在為大型和小型應用提供一個良好的起點。但是你可以自由地組織你的應用資料夾結構。只要 Composer 可以自動加載類別,Laravel 幾乎不限制你將類別放在任何的位置

如果你沒按照 Laravel預設規劃來擺放你的類別,將為此付出設定變多,且維護難度提高的代價,這是官方文件沒說的事實


專案根資料夾

app資料夾

app 資料夾存放你應用的核心程式碼,應用中幾乎所有重要的類別都將位於此資料夾,也是你所撰寫的程式碼主要存放的資料夾。等會會用大篇幅來好好聊一聊

bootstrap資料夾

bootstrap 資料夾包含了框架的啟動檔案 app.php 。該資料夾還包含 cache 目錄,其中包含用於提升框架性能的生成檔案,例如路由和服務快取檔案,因此有時會出現權限錯誤要求你開放這個資料夾的寫入權限

config資料夾

config 資料夾就如其名包含了應用的所有設定檔案。最好能把這些文件都瀏覽過一遍,並熟悉所有應用可用的選項,裏頭一些隱私的設定會被移到 .env這個檔案內,或許這架構對新手有些困擾,以下我來解釋一下

在裏頭你將會看到很多的檔案,比如 app.php .database.php 等等。其中前 者可理解為專案的主設定檔,而後者可理解為資料庫設定檔。那既然設定檔都放在config資料夾內,為什麼又有一個叫.env,也是設定檔呢?

這是個好問題,所有 config 資料夾內的設定檔,都會被納入版本控管,被上傳到Github或Bithucket伺服器,如果你的設定有包含像是帳號密碼等隱私資料也一起被上傳是不妥的。因此Laravel設計了一個機制就是把比較機密的設定移到一個檔名很奇怪的檔案,叫做.env,它將不會被版本控管,因此你在部署時需要另外上傳並修改

那.env和 config資料夾的關係又是甚麼? 舉app.php來說,有一些設定你會看到寫 env('APP_KEY'),這就是在從.env去取值的一個幫助函式。

邏輯是你的應用"總是"會到config資料夾內去尋找設定,當設定檔告訴它真實內容在.env裏頭,它才會改去.env去抓設定

database資料夾

database 資料夾包含資料庫的 Migration,模型工廠和 Seeder 文件。如果你想的話,也可以將之作為 SQLite 資料庫存放目錄

public資料夾

public 資料夾包含 index.php 文件,它是所有請求進入應用的入口,用以配置自動加載。該資料夾還包含您的素材資源,如圖像、JavaScript 腳本和 CSS 樣式。而 public 資料夾也是整個 Laravel 專案唯一對外開放的資料夾,這和一般 PHP 專案資料夾完全對外開放有很大的不同,從而提高了應用的安全性

你或許會感到困惑的是,storage 資料夾內的檔案似乎也能對外開放,但實際上那是透過下面的這個指令在 public 資料夾內為 storage 資料夾去建立了一個捷徑而帶來的效果

php artisan storage:link

resources資料夾

resources 資料夾包含了視圖和未編譯的資源檔案(如 LESS、SASS 或 JavaScript),還包含你所有的本地化檔案

routes資料夾

routes 資料夾包含應用的所有路由定義。預設情況下,Laravel 包含幾個路由文件:web.php, api.php, console.php 以及 channels.php

web.php 檔案包含 RouteServiceProvider 放置在 web 中介層群組的路由,這些中介層提供會話(Session)狀態、CSRF 保護和 cookie 加密。如果您的應用不需提供無狀態的 RESTful API,那麼您的所有路由都能夠放在 web.php 檔案內

api.php 檔案包含 RouteServiceProvider 放置在 api 中介層群組的路由,這些中介層提供速率限制。放在這個檔案內的這些路由應該是無狀態的,因此通過這些路由進入應用的請求將通過口令(Token)來進行身份驗證,並且不能訪問會話(Session)狀態

console.php 檔案是可用以定義所有基於閉包的控制台命令的地方。每個閉包都綁定到一個命令實例,允許使用一種簡單的方法與每個命令進行輸出入互動。儘管這個檔案沒有定義 HTTP 路由,但是它定義了應用中基於控制台的入口(路由),也就是命令相關的路由可放在這裡

channels.php 檔案是你可以註冊應用支持的所有事件廣播頻道的位置

storage資料夾

storage 資料夾包含由 Blade 視圖框架生成的編譯檔案、以檔案形式儲存的會話(Session)內容和快取檔案。這個資料夾分成 app、framework 和 logs 目錄 app 資料夾可用於存放應用生成的任何檔案。framework 資料夾用於存放 laravel 框架生成的檔案和快取。最後,logs 目錄則包含應用的日誌文件

storage/app/public 資料夾用來存放用戶生成或上傳的檔案,例如使用者頭像,而它們應該是能夠被公開訪問的。為此,你需要創建一個指向到這個目錄的軟連結 public/storage (換言之,在 public 資料夾會有個 storage 捷徑,能跳轉到 storage/app/public 資料夾), 假如這個軟連結不存在,你可以通過這個命令 php artisan storage:link 來生成它

tests資料夾

tests 資料夾包含自動化測試類別,這包含了範例單元測試與功能測試。每個測試類別都應該用單詞 Test 作為後綴。您可以使用 phpunit 或 php vendor/bin/phpunit 命令來運行測試。如果你想要更多完整資訊,並讓你的測試結果顯示得更為美觀,你可以透過 php artisan test 這樣的命令來運作你的測試

vendor資料夾

vendor 資料夾包含你的 Composer 依賴,也就是所有下載的套件都被放在這個目錄之內,一般這個資料夾不會被版本控管


深訪app資料夾

應用的大部分程式碼都位於 app 目錄中。預設情況下,此目錄的名稱空間在 App 下(而非資料夾名稱app),並由 Composer 使用 PSR-4 標準來自動加載

app 資料夾包含各種目錄,如 Console、Http 和 Providers。可以將 Console 和 Http 資料夾看作是為應用的核心提供了一個 API。HTTP 協議和 CLI 都是與應用交互的機制,但實際上並不包含應用程式邏輯。換句話說,它們是向應用程序發出命令的兩種方式。Console 目錄包含所有 Artisan 命令,而 Http 目錄則包含控制器、中介層和請求

當使用 make 系列的 Artisan 命令生成類別時,將在 app 資料夾內生成各種目錄。例如當你執行 make:job 命令生成隊列類別時,將會生成 app/Jobs 資料夾

技巧:

app 目錄中的許多類別都可以由 Artisan 通過命令生成。要查看可用的命令,請在終端中運行 php artisan list make 命令,或者是運行 php artisan 也能夠看到所有的命令

Broadcasting資料夾(進階技巧)

Broadcasting 資料夾包含應用的所有廣播頻道類別,這些類別都是通過 make:channel 命令生成的。這個目錄預設是不存在的,但是當你創建第一個廣播頻道類別時它會自動生成

Console資料夾

Console 資料夾包含應用所有自定義的 Artisan 命令, 這些類別通過 make:command 命令而生成。 此目錄也安置了控制台內核,在其中你可以註冊自定義的 Artisan 命令,並定義你的排程工作

Events資料夾(進階技巧)

該資料夾預設是不存在的,但可以通過 event:generate 和 make:event 命令來創建。Events 目錄用於存放事件類別。事件類別用於告知應用其他部分某個事件的發生與情況並提供靈活的、解耦的處理機制

Exceptions資料夾

Exceptions 資料夾包含應用的異常處理器,同時還是處理應用拋出的任何異常的好地方。如果你想要自定義異常該如何記錄或渲染,就需要編輯該資料夾裏頭的 Handler 類別

Http資料夾

Http 資料夾包含了控制器、中介層以及表單請求等,幾乎所有通過 Web 路由進入應用的請求處理都在這裡進行,也可以說是你入門時最常打交道的資料夾之一

Jobs資料夾(進階技巧)

這個資料夾預設不存在,但可以通過執行 make:job 命令來生成,Jobs 目錄用於存放應用的隊列任務,應用中的任務可以被推送至隊列,也可以在當前請求生命周期內同步執行。同步執行的任務有時也被看作是命令,因為它們實現的結果和命令模式非常接近

Listeners資料夾(進階技巧)

預設情況下此資料夾也不存在,但如果你執行 event:generate 或 make:listener Artisan 命令的話就會自動生成。Listeners 目錄包含所有處理事件的類別。在事件觸發後,事件偵聽器接收事件實例並執行處理邏輯。例如,UserRegistered 事件被 SendWelcomeEmail 監聽器所處理

Mail資料夾(進階技巧)

預設情況下,此資料夾不存在,但如果你執行 make:mail Artisan 命令時就會自動生成。Mail 目錄包含應用所有代表被發送電子郵件的類別。Mail 對象允許你將構建電子郵件的所有邏輯封裝在一個簡單的類別中,而該類別可以使用 Mail::send() 進行發送

Models資料夾

Models 資料夾包含所有 Eloquent 模型類別,這也是在8.x所新增的資料夾,在之前版本所有的模型是直接放在 app 資料夾內。Laravel 附帶的 Eloquent ORM 為處理資料庫提供了一個漂亮、簡單的 ActiveRecord 實作。每個資料庫表格都有一個對應的「模型」,用於與該表格進行交互。模型能協助你查詢表格中的數據,以及向表格寫入新記錄

Notifications資料夾(進階技巧)

預設情況下,此資料夾不存在,但如果你執行 make:notification Artisan 命令時會自動生成。Notifications 資料夾包含所有被你的應用所發送的「事務性」通知,例如關於應用內所發生事件的簡單通知。Laravel 的通知功能抽象了通過各種驅動發送的通知,如電子郵件通知、Slack 資訊、SMS 短信通知或資料庫存儲

Policies資料夾(進階技巧)

預設情況下,此資料夾不存在,但如果執行 make:policy Artisan 命令就會生成。Policies 目錄包含應用的授權邏輯類別。這些類用於確認用戶是否可以對資源執行某種的操作

Providers資料夾

Providers 資料夾包含應用中所有的服務供應器。服務供應器通過在服務容器中綁定服務、註冊事件或執行任何其他任務來引導應用以準備好應對將傳入的請求

在一個新的 Laravel 應用中,這個資料夾已經包含了幾個供應器,最常用的當屬 AppServiceProvider.php。您可以根據需要將自己的供應器加入此資料夾

Rules資料夾(進階技巧)

預設情況下,此資料夾不存在,但如果執行 make:rule Artisan 命令後就會生成。Rules 資料夾包含應用內自定義的驗證規則。這些驗證規則用於將複雜的驗證邏輯封裝在一個簡單的對象中


分享這篇文章:

留下留言