# 目錄結構
# Laravel 的文件夾結構
## 簡介
>[success]默認的 Laravel 應用結構旨在為不同大小的應用提供一個好的起點。當然,你可以按照喜好管理應用的目錄結構。Laravel 沒有嚴格地限制任何給定的類的位置,只要它們能被 Composer 自動加載。
#### 為什么沒有模型目錄?
當開始使用 Laravel 時,許多開發人員都因缺少`models`目錄而感到困惑。然而,缺少這樣的目錄是故意的。我們發現「模型」含糊不清,因為不同的人對「模型」有不同的理解。一些開發者把應用的「模型」稱為其所有業務邏輯的總體,而另一些人將「模型」稱為與關系數據庫交互的類。
因此,我們默認把 Eloquent 的模型放在`app`目錄下,并且允許開發者自行選擇把「模型」放置在何處。
## 根目錄
#### App 目錄
`app`目錄包含應用程序的核心代碼。你應用中幾乎所有的類都應該放在這里。稍后我們會更深入地了解這個目錄的細節。
#### Bootstrap 目錄
`bootstrap`目錄包含啟動框架的`app.php`文件. 該目錄還包含了一個`cache`目錄,`cache`目錄下存放著框架生成的用來提升性能的文件,比如路由和服務緩存文件。
#### Config 目錄
`config`目錄,顧名思義,包含應用程序所有的配置文件。我們鼓勵你通讀這些文件,以便幫助你熟悉所有可用的選項。
#### Database 目錄
`database`目錄包含數據填充和遷移文件以及模型工廠類。你還可以把它作為 SQLite 數據庫存放目錄。
#### Public 目錄
`public`目錄包含了入口文件`index.php`,它是進入應用程序的所有請求的入口點。此目錄還包含了一些你的資源文件(如圖片、JavaScript 和 CSS)。
#### Resources 目錄
`resource`目錄包含了視圖和未編譯的資源文件(如 LESS、SASS 或 JavaScript)。此目錄還包含你所有的語言文件。
#### Routes 目錄
`routes`目錄包含了應用的所有路由定義,Laravel 默認包含了幾個路由文件:`web.php`、`api.php`、`console.php`和`channels.php`。
`web.php`文件包含`RouteServiceProvider`放置在`web`中間件組中的路由,它提供會話狀態、CSRF 防護和 cookie 加密。如果你的應用不提供無狀態的、RESTful 風格的 API,則所有的路由都應該在`web.php`文件中定義。.
`api.php`文件包含`RouteServiceProvider`放置在`api`中間件組中的路由,它提供了頻率限制。這些路由都是無狀態的,所以通過這些路由進入應用請求旨在通過令牌進行身份認證,并且不能訪問會話狀態。
`console.php`文件是定義所有基于控制臺命令閉包函數的地方。每個閉包函數都被綁定到一個命令實例并且允許和命令行 IO 方法進行簡單的交互。盡管這些文件沒有定義 HTTP 路由,但它也將基于控制臺的入口點(路由)定義到應用程序中。
`channels.php`用來注冊你的應用支持的所有的事件廣播渠道的地方。
#### Storage 目錄
`storage`目錄包含編譯后的 Blade 模板、session 會話生成的文件、緩存文件以及框架生成的其他文件。這個目錄被細分成`app`、`framework`和`logs`三個子目錄。`app`目錄可以用來存儲應用生成的任何文件。`framework`目錄用來存儲框架生成的文件和緩存。最后,`logs`目錄包含應用的日志文件。
`storage/app/public`可以用來存儲用戶生成的文件,比如需要公開訪問的用戶頭像。你應該創建一個`public/storage`的軟鏈接指向這個目錄。你可以直接通過`php artisan storage:link`命令來創建此鏈接。
#### Tests 目錄
`tests`目錄包含自動化測試文件。在[PHPUnit](https://phpunit.de/)有現成的范例供你參考. 每個測試類都應該以`Test`作為后綴。你可以使用`phpunit`或者`php vendor/bin/phpunit`命令來運行測試。
#### Vendor 目錄
`vendor`目錄包含你所有的[Composer](https://getcomposer.org/)依賴包。
## App 目錄
應用程序的大部分代碼都在`app`目錄內。默認情況下,這個目錄位于命名空間`App`下并且會被 Composer 按照[PSR-4 autoloading standard](http://www.php-fig.org/psr/psr-4/)標準自動加載。
`app`目錄包含了各種各樣的目錄,比如`Console`、`Http`和`Providers`等。其中`Console`和`Http`提供進入應用核心的 API 。HTTP 協議和 CLI 是不同的和應用交互的機制,實際上并不包含應用邏輯。也就是說,它們只是兩種向應用發出命令的方法。`Console`目錄里包含了所有的`Artisan`命令,`Http`目錄包含了應用的控制器、中間件和請求。
當你通過 Artisan 提供的`make`命令來生成類時,會在`app`中生成各種各樣的目錄。例如,執行 Artisan 命令`make:job`程序會自動生成`app/Jobs`目錄。
> {tip}`app`目錄里的許多類都可以通過 Artisan 命令來生成。要查看可用的命令,只要在終端里運行`php artisan list make`命令即可。
#### Broadcasting 目錄
`Broadcasting`目錄包含應用程序的所有廣播頻道類。 這些類可以通過使用`make:channel`命令來創建。 默認情況下此目錄是不存在的,在創建第一個頻道類時將為你創建此目錄。 要了解有關頻道的更多信息,請查閱[事件廣播].
#### Console 目錄
`Console`目錄包含了所有自定義的 Artisan 命令。這些命令可以通過`make:command`來生成。這個目錄還包含了控制臺內核,控制臺內核可以用來注冊你的自定義 Artisan 命令和你定義的[計劃任務]的地方
#### Events 目錄
Events 目錄默認是不存在的,它會在你運行 Artisan 命令`event:generate`或`make:event`時生成。`Events`目錄存放了[事件類]。可以使用事件來提醒應用其他部分發生了特定的操作,使應用程序更加的靈活和解耦。
#### Exceptions 目錄
`Exceptions`目錄包含了應用的異常處理器,也是應用拋出異常的好地方。如果想自定義記錄或者渲染異常的方式,你就要修改此目錄下的`Handler`類。
#### Http 目錄
`Http`目錄包含了控制器、中間件和表單請求。幾乎所有的進入應用的請求的處理邏輯都被放在這里。
#### Jobs 目錄
`Jobs`目錄默認是不存在的,它會在你運行 Artisan 命令`make:job`時生成。這個目錄存放了應用中的[隊列任務]。 應用的任務可以被推送到隊列或者在當前請求的生命周期內同步運行。在當前請求期間同步運行的任務可以看做是一個「命令」,因為它們是[命令模式]的實現。
#### Listeners 目錄
`Listeners`目錄默認是不存在的,它會在你運行 Artisan 命令`event:generate`或`make:listener`時生成。`Listeners`目錄包含了用來處理[事件]的類。事件監聽器接收事件實例并執行響應該事件被觸發的邏輯。例如,`UserRegistered`事件可能由`SendWelcomeEmail`監聽器處理。
#### Mail 目錄
`Mail`目錄默認不存在,它會在你運行 Artisan 命令`make:mail`時生成。`Mail`目錄包含應用所有的郵件發送類。郵件對象允許你將郵件的邏輯封裝單個類中,郵件對象還可以使用`Mail::send`方法來發送郵件。
#### Notifications 目錄
`Notifications`目錄默認不存在,它會在你運行 Artisan 命令`make:notification`時生成。`Notifications`目錄包含應用發送的所有「業務性」通知,比如關于在應用中發生的事件的簡單通知。Laravel 的通知功能抽象了發送通知接口,你可以通過各種驅動(例如郵件、Slack、短信)發送通知,或是存儲在數據庫中。
#### Policies 目錄
`Policies`目錄默認不存在,它會通過運行 Artisan 命令`make:policy`來創建。`Policies`目錄包含了應用的授權策略類。策略可以用來決定一個用戶是否有權限去操作指定資源。更多詳情可以查看[授權文檔](https://laravel-china.org/docs/laravel/5.7/authorization)。
#### Providers 目錄
`Providers`目錄包含了應用的所有[服務提供者](https://laravel-china.org/docs/laravel/5.7/providers)。服務提供者通過在服務容器中綁定服務、注冊事件、以及執行其他任務來為即將到來的請求做準備來啟動應用。
在一個新的 Laravel 應用里,`Providers`目錄已經包含了一些服務提供者。你可以按照需要把自己的服務提供者添加到該目錄。
#### Rules 目錄
`Rules`目錄默認不存在,它會在運行 Artisan 命令`make:rule`命令時被創建。`Rules`目錄包含應用自定義驗證規則對象。這些規則意在將復雜的驗證邏輯封裝在一個簡單的對象中。更多詳情可以查看[驗證文檔]