# 簡介
Laravel 默認的目錄結構試圖為不管是大型應用還是小型應用提供一個良好的起點。當然,你也可以按照自己的喜好重新組織應用的目錄結構,因為 Laravel 對于指定類在何處被加載沒有任何限制 —— 只要 Composer 可以自動載入它們即可。
**Models 目錄在哪里?
**
許多初學者都會困惑 Laravel 為什么沒有提供 `models` 目錄,我可以負責任的告訴大家,這是故意的。因為 models 這個詞對不同人而言有不同的含義,容易造成歧義,有些開發者認為應用的模型指的是業務邏輯,另外一些人則認為模型指的是與關聯數據庫的交互。
正是因為這個原因,我們默認將 Eloquent 的模型直接放置到 `app` 目錄下,開發者可以自行選擇放置的位置。
這是 Laravel 框架作者的想法,不過對于國內開發者,尤其是 PHP 開發者來說,`models` 目錄用于存放與數據庫交互的模型類應該沒有什么異議,而業務邏輯應該放到 `services` 這種目錄之下。所以推薦大家在生成模型類的時候指定生成到 `app/Models` 目錄下:
~~~
php artisan make:model Models/Test
~~~
:-: 
# 根目錄
**App目錄**
`app` 目錄包含了應用的核心代碼,注意不是框架的核心代碼,框架的核心代碼在 `/vendor/laravel/framework` 里面,此外你為應用編寫的代碼絕大多數也會放到這里,當然,如果你基于 Composer 做了 PHP 組件化開發的話,這里面存放的恐怕也只有一些入口性的代碼了;
**Bootstrap目錄**
`bootstrap` 目錄包含了少許文件,用于框架的啟動和自動載入配置,還有一個 cache 文件夾,里面包含了框架為提升性能所生成的文件,如路由和服務緩存文件;
**Config目錄**
`config` 目錄包含了應用所有的配置文件,建議通讀一遍這些配置文件以便熟悉 Laravel 所有默認配置項;
**Database目錄**
`database` 目錄包含了數據庫遷移文件及填充文件,如果有使用 SQLite 的話,你還可以將其作為 SQLite 數據庫存放目錄;
**Public目錄**
`public` 目錄包含了應用入口文件 `index.php` 和前端資源文件(圖片、JavaScript、CSS等),該目錄也是 Apache 或 Nginx 等 Web 服務器所指向的應用根目錄,這樣做的好處是隔離了應用核心文件直接暴露于 Web 根目錄之下,如果權限系統沒做好或服務器配置有漏洞的話,很可能導致應用敏感文件被黑客竊取,進而對網站安全造成威脅;
**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` 文件包含的路由位于 `api` 中間件組約束之內,支持頻率限制功能,這些路由是無狀態的,所以請求通過這些路由進入應用需要通過 token 進行認證并且不能訪問 Session 狀態。
`console.php` 文件用于定義所有基于閉包的控制臺命令,每個閉包都被綁定到一個控制臺命令并且允許與命令行 IO 方法進行交互,盡管這個文件并不定義 HTTP 路由,但是它定義了基于控制臺的應用入口(路由)。
`channels.php` 文件用于注冊應用支持的所有事件廣播頻道。
**Storage目錄**
`storage` 目錄包含了編譯后的 Blade 模板、基于文件的 Session、文件緩存,以及其它由框架生成的文件,該目錄被細分為成 `app`、`framework` 和 `logs` 子目錄,`app` 目錄用于存放應用生成的文件,`framework` 目錄用于存放框架生成的文件和緩存,最后,`logs` 目錄存放的是應用的日志文件。
`storage/app/public` 目錄用于存儲用戶生成的文件,比如可以被公開訪問的用戶頭像,要達到被 Web 用戶訪問的目的,你還需要在 `public` (應用根目錄下的 `public` 目錄)目錄下生成一個軟連接 `storage` 指向這個目錄。你可以通過 `php artisan storage:link` 命令生成這個軟鏈接。
**Tests目錄**
`tests` 目錄包含自動化測試文件,其中默認已經提供了一個開箱即用的`PHPUnit` 示例;每一個測試類都要以 `Test` 開頭,你可以通過 `phpunit` 或 `php vendor/bin/phpunit` 命令來運行測試。
**Vendor目錄**
`vendor` 目錄包含了應用所有通過 `Composer` 加載的依賴。
# App目錄
應用的核心代碼位于 `app` 目錄下,默認情況下,該目錄位于命名空間 `App` 下, 并且被 Composer 通過 `PSR-4 自動載入標準` 自動加載。
`app` 目錄下包含多個子目錄,如 `Console`、`Http`、`Providers等`。`Console` 和 `Http` 目錄提供了進入應用核心的 API,HTTP 協議和 CLI 是和應用進行交互的兩種機制,但實際上并不包含應用邏輯。換句話說,它們只是兩個向應用發送命令的方式。`Console` 目錄包含了所有開發者編寫的 Artisan 命令,`Http` 目錄包含了控制器、中間件和請求等。
其他目錄會在你通過 Artisan 命令 `make` 生成相應類的時候自動生成到 `app` 目錄下。例如,`app/Jobs` 目錄直到你執行 `make:job` 命令生成任務類時才會出現在 `app` 目錄下。
> 注:`app` 目錄中的很多類都可以通過 Artisan 命令生成,要查看所有有效的命令,可以在終端中運行 `php artisan list make` 命令。
**Broadcasting目錄**
`Broadcasting` 目錄包含了應用所需的所有廣播頻道類,這些類通過 `make:channel` 命令生成。該目錄默認不存在,但是當你通過命令第一次創建頻道類時會自動生成。想要了解更多關于頻道的信息,可以查看事件廣播文檔。
**Console目錄**
`Console` 目錄包含應用所有自定義的 Artisan 命令,這些命令類可以使用 `make:command` 命令生成。該目錄下還有 `Console/Kernel` 類,在這里可以注冊自定義的 Artisan 命令以及定義調度任務。
**Events目錄**
這個目錄默認不存在,但是可以通過 `event:generate` 和 `make:event` 命令創建。該目錄用于存放事件類。事件類用于告知應用其他部分某個事件發生情況并提供靈活的、解耦的處理機制。
**Exceptions目錄**
`Exceptions` 目錄包含應用的異常處理器,同時還是處理應用拋出的任何異常的好地方。如果你想要自定義異常如何記錄或渲染,需要編輯該目錄下的 `Handler` 類。
**Http目錄**
`Http` 目錄包含了控制器、中間件以及表單請求等,幾乎所有通過 Web 進入應用的請求處理都在這里進行。
**Jobs目錄**
該目錄默認不存在,可以通過執行 `make:job` 命令生成,`Jobs` 目錄用于存放隊列任務,應用中的任務可以被推送到隊列,也可以在當前請求生命周期內同步執行。同步執行的任務有時也被看作命令,因為它們實現了命令模式。
**Listeners目錄**
這個目錄默認不存在,可以通過執行 `event:generate` 和 `make:listener` 命令創建。`Listeners` 目錄包含處理事件的類(事件監聽器),事件監聽器接收一個事件并提供對該事件發生后的響應邏輯,例如,`UserRegistered` 事件可以被 `SendWelcomeEmail` 監聽器處理。
**Mail目錄**
這個目錄默認不存在,但是可以通過執行 `make:mail` 命令生成,`Mail` 目錄包含應用所有郵件相關類,郵件對象允許你在一個地方封裝構建郵件所需的所有業務邏輯,然后使用 `Mail::send` 方法發送郵件。
**Notifications目錄**
這個目錄默認不存在,你可以通過執行 `make:notification` 命令連帶創建, `Notifications` 目錄包含應用發送的所有通知,比如事件發生通知。Laravel 的通知功能將通知發送和通知驅動解耦,你可以通過郵件,也可以通過Slack、短信或者數據庫發送通知。
**Policies目錄**
這個目錄默認不存在,你可以通過執行 `make:policy` 命令生成策略類來創建, `Policies` 目錄包含了應用所有的授權策略類,策略用于判斷某個用戶是否有權限去訪問指定資源。更多詳情,請查看授權文檔。
**Providers目錄**
`Providers` 目錄包含應用的所有服務提供者。服務提供者在應用啟動過程中綁定服務到容器、注冊事件以及執行其他任務為即將到來的請求處理做好準備工作。
在新安裝的 Laravel 應用中,該目錄已經包含了一些服務提供者,你可以按需添加自己的服務提供者到該目錄。
**Rules目錄**
該目錄默認不存在,但是會伴隨你執行 Artisan 命令 `make:rule` 自動生成。`Rules` 目錄包含應用的自定義驗證規則對象,這些規則用于在單個對象中封裝復雜的驗證邏輯,想要了解更多的話,請參考驗證文檔。
- 序言
- 新版特性
- 快速入門
- 升級指南
- 貢獻指南
- API文檔
- 安裝配置
- 目錄結構
- Homestead
- Valet
- 部署
- 核心概念
- 請求生命周期
- 服務容器
- 服務提供者
- 門面(Facades)
- 契約(Contracts)
- 框架基礎
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- 生成 URL
- Session
- 驗證
- 錯誤處理
- 日志
- 前端開發
- Blade 模板
- 本地化
- 前端腳手架
- 編譯前端資源(Laravel Mix)
- 安全系列
- 登錄認證
- API 認證
- 授權
- 加密
- 哈希
- 重置密碼
- 進階系列
- Artisan 控制臺
- 集合
- 廣播
- 緩存
- 事件
- 文件存儲
- 輔助函數
- 郵件
- 通知
- 擴展包開發
- 隊列
- 任務調度
- 數據庫操作
- 快速入門
- 查詢構建器
- 分頁
- 遷移
- 數據填充
- Redis
- Eloquent ORM
- 快速入門
- 關聯關系
- 集合
- 訪問器 & 修改器
- API 資源類
- 序列化
- 應用測試
- 快速入門
- HTTP 測試
- 瀏覽器測試
- 數據庫測試
- 模擬
- 官方擴展包
- Cashier(訂閱支付解決方案)
- Envoy(遠程操作解決方案)
- Horizon(隊列系統解決方案)
- Passport(API 認證解決方案)
- Scout(全文搜索解決方案)
- Socialite(第三方登錄解決方案)
- 相關下載
- Laravel 5.6 中文文檔離線版
- Laravel 5.6 一鍵安裝包