# 文件夾結構
- [簡介](#introduction)
- [根目錄](#the-root-directory)
- [`app` 目錄](#the-root-app-directory)
- [`bootstrap` 目錄](#the-bootstrap-directory)
- [`config` 目錄](#the-config-directory)
- [`database` 目錄](#the-database-directory)
- [`public` 目錄](#the-public-directory)
- [`resources` 目錄](#the-resources-directory)
- [`routes` 目錄](#the-routes-directory)
- [`storage` 目錄](#the-storage-directory)
- [`tests` 目錄](#the-tests-directory)
- [`vendor` 目錄](#the-vendor-directory)
- [App 目錄](#the-app-directory)
- [`Console` 目錄](#the-console-directory)
- [`Events` 目錄](#the-events-directory)
- [`Exceptions` 目錄](#the-exceptions-directory)
- [`Http` 目錄](#the-http-directory)
- [`Jobs` 目錄](#the-jobs-directory)
- [`Listeners` 目錄](#the-listeners-directory)
- [`Mail` 目錄](#the-mail-directory)
- [`Notifications` 目錄](#the-notifications-directory)
- [`Policies` 目錄](#the-policies-directory)
- [`Providers` 目錄](#the-providers-directory)
- [`Rules` 目錄](#the-rules-directory)
<a name="introduction"></a>
## 簡介
默認的 Laravel 應用結構旨在為不同大小的應用提供一個好的起點。當然,你可以按照喜好整理應用的目錄結構。Laravel 沒有嚴格地限制任何給定的類的位置,只要它們能被 Composer 自動加載。
#### 為什么沒有模型目錄?
當開始使用 Laravel 時,許多開發人員都因缺少 `models` 目錄而感到困惑。然而,缺少這樣的目錄是故意的。我們發現「模型」含糊不清,因為對許多不同的人來說有著各自不同的理解。一些開發者把應用的「模型」稱為其所有業務邏輯的總體,而另一些人將「模型」稱為與關系數據庫交互的類。
因此,我們默認把 Eloquernt 的模型放在 `app` 目錄下,并且允許開發者自行選擇放置在何處。
<a name="the-root-directory"></a>
## 根目錄
<a name="the-root-app-directory"></a>
#### `app` 目錄
`app` 目錄包含應用程序的核心代碼。你應用中幾乎所有的類都應該放在這里。稍后我們會更深入地了解這個目錄的細節。
<a name="the-bootstrap-directory"></a>
#### `Bootstrap` 目錄
`bootstrap` 目錄包含引導框架并配置自動加載的文件。該目錄還包含了一個 `cache` 目錄,存放著框架生成的用來提升性能的文件,比如路由和服務緩存文件。
<a name="the-config-directory"></a>
#### `Config` 目錄
`config` 目錄,顧名思義,包含應用程序所有的配置文件。我們鼓勵你通讀這些文件,以便幫助你熟悉所有可用的選項。
<a name="the-database-directory"></a>
#### `Database` 目錄
`database` 目錄包含數據填充和遷移文件。你還可以把它作為 SQLite 數據庫存放目錄。
<a name="the-public-directory"></a>
#### `Public` 目錄
`public` 目錄包含了入口文件 `index.php`,它是進入應用程序的所有請求的入口點。此目錄還包含了一些你的資源文件(如圖片、JavaScript 和 CSS)。
<a name="the-resources-directory"></a>
#### `Resources` 目錄
`resource` 目錄包含了視圖和未編譯的資源文件(如 LESS、SASS 或 JavaScript)。此目錄還包含你所有的語言文件。
<a name="the-routes-directory"></a>
#### `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` 用來注冊你的應用支持的所有的事件廣播渠道的地方。
<a name="the-storage-directory"></a>
#### `Storage` 目錄
`storage` 目錄包含編譯的 Blade 模板、基于文件的會話和文件緩存、以及框架生成的其他文件。這個目錄被細分成 `app `、`framework` 和 `logs` 三個子目錄。`app` 目錄可以用來存儲應用生成的任何文件。`framework` 目錄用來存儲框架生成的文件和緩存。最后,`logs` 目錄包含應用的日志文件。
`storage/app/public` 可以用來存儲用戶生成的文件,比如需要公開訪問的用戶頭像。你應該創建一個 `public/storage` 的軟鏈接指向這個目錄。你可以直接通過 `php artisan storage:link` 命令來創建此鏈接。
<a name="the-tests-directory"></a>
#### `Tests` 目錄
`tests` 目錄包含自動化測試文件。Laravel 已內置了 [PHPUnit](https://phpunit.de/) 的測試范例供你參考。每個測試類都應該以 `Test` 作為后綴。你可以使用 `phpunit` 或者 `php vendor/bin/phpunit` 命令來運行測試。
<a name="the-vendor-directory"></a>
#### `Vendor` 目錄
`vendor` 目錄包含了你的 [Composer](https://getcomposer.org) 依賴包。
<a name="the-app-directory"></a>
## `App` 目錄
應用程序的核心代碼位于 `app` 目錄內。默認情況下,這個目錄位于命名空間 `App` 下,并由 Composer 按照 [PSR-4 自動載入標準](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` 命令即可。
<a name="the-console-directory"></a>
#### `Console` 目錄
`Console` 目錄包含了所有自定義的 Artisan 命令。這些命令可以通過 `make:command` 來生成。這個目錄還包含了控制臺內核,可以用來注冊你的自定義 Artisan 命令和你定義的 [計劃任務](/docs/{{version}}/scheduling) 的地方。
<a name="the-events-directory"></a>
#### `Events` 目錄
`Events` 目錄默認是不存在的,它會在你運行 Artisan 命令 `event:generate` 或 `event:make` 時生成。`Events` 目錄存放了 [事件類](/docs/{{version}}/events)。可以使用事件來提醒應用其他部分發生了特定的操作,為應用提供了大量的靈活性和解耦。
<a name="the-exceptions-directory"></a>
#### `Exceptions` 目錄
`Exceptions` 目錄包含了應用的異常處理器,也是應用跑出異常的好地方。如果想自定義記錄或者渲染異常的方式,你就要修改此目錄下的 Handler 類。
<a name="the-http-directory"></a>
#### `Http` 目錄
`Http` 目錄包含了控制器、中間件和表單請求。幾乎所有的進入應用的請求的處理邏輯都被放在這里。
<a name="the-jobs-directory"></a>
#### `Jobs` 目錄
`Jobs` 目錄默認是不存在的,它會在你運行Artisan 命令 `make:job` 時生成。這個目錄存放了應用中的 [隊列任務](/docs/{{version}}/queues)。應用的任務可以被推送到隊列或者在當前請求的生命周期內同步運行。在當前請求期間同步運行的任務可以看做是一個「命令」,因為它們是 [命令模式](https://en.wikipedia.org/wiki/Command_pattern) 的實現。
<a name="the-listeners-directory"></a>
#### `Listeners` 目錄
`Listeners` 目錄默認是不存在的,它會在你運行 Artisan 命令 `event:generate` 或 `make:listenr` 時生成。`Listeners` 目錄包含了用來處理 [事件](/docs/{{version}}/events) 的類。事件監聽器接收事件實例并執行響應該事件被觸發的邏輯。例如,`UserRegistered` 事件可能由 `SendWelcomeEmail` 監聽器處理。
<a name="the-mail-directory"></a>
#### `Mail` 目錄
`Mail` 目錄默認不存在,它會在你運行 Artisan 命令 `make:mail` 時生成。`Mail` 目錄包含應用所有的郵件發送類。郵件對象允許你將構建郵件的邏輯封裝在可以使用 `Mail::send` 方法來發送郵件的地方。
<a name="the-notifications-directory"></a>
#### `Notifications` 目錄
`Notifications` 目錄默認不存在,它會在你運行 Artisan 命令 `make:notification` 時生成。`Notifications` 目錄包含應用發送的所有「事務性」通知,比如關于在應用中發生的事件的簡單通知。Laravel 的通知功能抽象了通知發送,可以通過各種驅動(例如郵件、Slack、短信)發送通知,或是存儲在數據庫中。
<a name="the-policies-directory"></a>
#### `Policies` 目錄
`Policies` 目錄默認不存在,它會通過運行 Artisan 命令 `make:policy` 來創建。`Policies` 目錄包含了應用的授權策略類。策略可以用來決定一個用戶是否有權限去操作指定資源。更多詳情可以查看 [授權文檔](/docs/{{version}}/authorization)。
<a name="the-providers-directory"></a>
#### `Providers` 目錄
`Providers` 目錄包含了應用的所有 [服務提供器](/docs/{{version}}/providers)。服務提供器通過在服務容器中綁定服務、注冊事件、以及執行其他任務來為即將到來的請求做準備來啟動應用。
在一個新的 Laravel 應用里,這個目錄已經包含了一些服務提供器。你可以按照需要把自由添加自己的服務提供器到該目錄。
<a name="the-rules-directory"></a>
#### `Rules` 目錄
`Rules` 目錄默認不存在,它會在運行 Artisan 命令 `make:rule` 命令時被創建。`Rules` 目錄包含應用自定義驗證規則對象。這些規則意在將復雜的驗證邏輯封裝在一個簡單的對象中。更多詳情可以查看 [驗證文檔](/docs/{{version}}/validation)。
## 譯者署名
| 用戶名 | 頭像 | 職能 | 簽名 |
| --- | --- | --- | --- |
| [@huiren](https://laravel-china.org/users/5583) | <img class="avatar-66 rm-style" src="https://dn-phphub.qbox.me/uploads/avatars/5583_1472366142.png?imageView2/1/w/100/h/100"> | 翻譯 | 認領翻譯,只是起點。 |
| [@JokerLinly](https://laravel-china.org/users/5350) | <img class="avatar-66 rm-style" src="https://dn-phphub.qbox.me/uploads/avatars/5350_1481857380.jpg"> | Review | Stay Hungry. Stay Foolish. |
---
> {note} 歡迎任何形式的轉載,但請務必注明出處,尊重他人勞動共創開源社區。
>
> 轉載請注明:本文檔由 Laravel China 社區 [laravel-china.org](https://laravel-china.org) 組織翻譯,詳見 [翻譯召集帖](https://laravel-china.org/topics/5756/laravel-55-document-translation-call-come-and-join-the-translation)。
>
> 文檔永久地址: https://d.laravel-china.org
- 說明
- 翻譯說明
- 發行說明
- 升級說明
- 貢獻導引
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- HomeStead
- Valet
- 核心架構
- 請求周期
- 服務容器
- 服務提供者
- 門面(Facades)
- Contracts
- 基礎功能
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- 重定向
- Session
- 表單驗證
- 錯誤與日志
- 前端開發
- Blade 模板
- 本地化
- 前端指南
- 編輯資源 Mix
- 安全
- 用戶認證
- API認證
- 用戶授權
- 加密解密
- 哈希
- 重置密碼
- 綜合話題
- Artisan 命令行
- 廣播系統
- 緩存系統
- 集合
- 事件系統
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- 數據填充
- Redis
- Eloquent ORM
- 快速入門
- 模型關聯
- Eloquent 集合
- 修改器
- API 資源
- 序列化
- 測試
- 快速入門
- HTTP 測試
- 瀏覽器測試 Dusk
- 數據庫測試
- 測試模擬器
- 官方擴展包
- Cashier 交易工具包
- Envoy 部署工具
- Horizon
- Passport OAuth 認證
- Scout 全文搜索
- Socialite 社交化登錄
- 交流說明