# 應用程序目錄結構
- [簡介](#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)
<a name="introduction"></a>
## 簡介
默認的 Laravel 應用程序結構意在給不同大小的應用程序提供一個好的起始點。當然,你也可以依照個人喜好來隨意組織應用程序。Laravel 幾乎沒有對任何類的放置位置進行強加限制 - 只要 Composer 可以自動加載這些類即可。
#### 為何沒有 Models 目錄?
許多初學者都會困惑 Laravel 為什么沒有 `models` 目錄,這是有意而為之的。因為 `models` 這個詞對不同人而言有不同的含義,容易造成歧義,有些開發者認為應用的模型指的是業務邏輯,另外一些人則認為模型指的是與數據庫的交互。
正是因為如此,我們默認將 Eloquent 的模型放置到 `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` 文件,此文件被視為 Laravel 的 HTTP 入口。此目錄還包含了前端控制器和資源文件(圖片、JavaScript、CSS,等等)。
<a name="the-resources-directory"></a>
#### Resources 目錄
`resources` 目錄包含了視圖、原始的資源文件 (LESS、SASS、CoffeeScript) ,以及語言包。
<a name="the-routes-directory"></a>
#### Routes 目錄
`routes` 目錄包含了應用的所有路由定義。Laravel 默認提供了三個路由文件:`web.php`、`api.php` 和 `console.php`。
`web.php` 文件里定義的路由都會在 `RouteServiceProvider` 中被指定應用到 `web` 中間件組,具備 Session、CSRF 防護以及 Cookie 加密功能,如果應用無需提供無狀態的、RESTful 風格的API,所有路由都會定義在 `web.php` 文件。
`api.php` 文件里定義的路由都會在 `RouteServiceProvider` 中被指定應用到 `api` 中間件組,具備頻率限制功能,這些路由是無狀態的,所以請求通過這些路由進入應用需要通過 API 令牌進行認證并且不能訪問 Session 狀態。
`console.php` 文件用于定義所有基于閉包的控制臺命令,每個閉包都被綁定到一個控制臺命令并且允許與命令行 IO 方法進行交互,盡管這個文件并不定義 HTTP 路由,但是它定義了基于命令行的應用入口(路由)。
<a name="the-storage-directory"></a>
#### Storage 目錄
`storage` 目錄包含編譯后的 Blade 模板、基于文件的 session、文件緩存和其它框架生成的文件。此文件夾分格成 `app`、`framework`,及 `logs` 目錄。`app` 目錄可用于存儲應用程序使用的任何文件。`framework` 目錄被用于保存框架生成的文件及緩存。最后,`logs` 目錄包含了應用程序的日志文件。
`storage/app/public` 可以用來生成用戶上傳文件,作為公開磁盤使用。默認的 `public` 磁盤使用 `local` 驅動,并且存儲文件至 `storage/app/public` 文件夾中。為了能公開訪問,你需要創建 `public/storage` 文件夾,然后作為符號鏈接到 `storage/app/public` 文件夾,你可以使用 `php artisan storage:link` 來創建符號鏈接。
<a name="the-tests-directory"></a>
#### Tests 目錄
`tests` 目錄包含自動化測試。這有一個現成的 [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 自動加載標準](https://phphub.org/topics/2081)自動加載。**你可以使用 `app:name` Artisan 命令修改這個命名空間**。
`app` 目錄附帶許多個額外的目錄,例如:`Console`、`Http` 和 `Providers`。可以將 `Console` 和 `Http` 目錄試想為提供 API 進入應用程序的「核心」。HTTP 協定和 CLI 都是跟應用程序進行交互的機制,但實際上并不包含應用程序邏輯。換句話說,它們是兩種簡單地發布命令給應用程序的方法。`Console` 目錄包含你全部的 Artisan 命令,而 `Http` 目錄包含你的控制器、中間件和請求。
其他目錄將會在你通過 Artisan 命令 `make` 生成相應類的時候生成到 `app` 目錄下。例如,`app/Jobs` 目錄在你執行 `make:job` 命令生成任務類時,才會出現在 `app` 目錄下。
> {tip} `app` 目錄中的很多類都可以通過 Artisan 命令生成,要查看所有有效的命令,可以在終端中運行 `php artisan list make` 命令。
<a name="the-console-directory"></a>
#### Console 目錄
`Console` 目錄包含應用所有自定義的 Artisan 命令,這些命令類可以使用 `make:command` 命令生成。該目錄下還有 `console` 核心類,在這里可以注冊自定義的 Artisan 命令以及定義 [調度任務](/docs/{{version}}/scheduling)。
<a name="the-events-directory"></a>
#### Events 目錄
`Events` 目錄默認不存在,會在你使用 `event:generate` 或者 `event:make` 命令以后才會生成。如你所料,此目錄是用來放置 [事件類](/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 目錄
該目錄默認不存在,可以通過執行 `make:job` 命令生成,`Jobs` 目錄用于存放 [隊列任務](/docs/{{version}}/queues),應用中的任務可以被隊列化,也可以在當前請求生命周期內同步執行。同步執行的任務有時也被看作命令,因為它們實現了 [命令總線設計模式](https://en.wikipedia.org/wiki/Command_pattern)。
<a name="the-listeners-directory"></a>
#### Listeners 目錄
這個目錄默認不存在,可以通過執行 `event:generate` 和 `make:listener` 命令創建。`Listeners` 目錄包含處理 [事件](/docs/{{version}}/events) 的類(事件監聽器),事件監聽器接收一個事件并提供對該事件發生后的響應邏輯,例如,`UserRegistered` 事件可以被 `SendWelcomeEmail` 監聽器處理。
<a name="the-mail-directory"></a>
#### Mail 目錄
這個目錄默認不存在,但是可以通過執行 `make:mail` 命令生成,`Mail` 目錄包含郵件發送類,郵件對象允許你在一個地方封裝構建郵件所需的所有業務邏輯,然后使用 `Mail::send` 方法發送郵件。
<a name="the-notifications-directory"></a>
#### Notifications 目錄
這個目錄默認不存在,你可以通過執行 `make:notification` 命令創建, `Notifications` 目錄包含應用發送的所有通知,比如事件發生通知。Laravel 的通知功能將通知發送和通知驅動解耦,你可以通過郵件,也可以通過 Slack、短信或者數據庫發送通知。
<a name="the-policies-directory"></a>
#### Policies 目錄
這個目錄默認不存在,你可以通過執行 `make:policy` 命令來創建, `Policies` 目錄包含了所有的授權策略類,策略用于判斷某個用戶是否有權限去訪問指定資源。更多詳情,請查看 [授權文檔](/docs/{{version}}/authorization)。
<a name="the-providers-directory"></a>
#### Providers 目錄
Providers 目錄包含應用的 [服務提供者](/docs/{{version}}/providers) 。服務提供者在啟動應用過程中綁定服務到容器、注冊事件,以及執行其他任務,為即將到來的請求處理做準備。
在新安裝的 Laravel 應用中,該目錄已經包含了一些服務提供者,你可以按需添加自己的服務提供者到該目錄。
- 說明
- 翻譯說明
- 發行說明
- 升級說明
- 貢獻導引
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- 錯誤與日志
- 開發環境
- HomeStead
- Valet
- 核心概念
- 服務容器
- 服務提供者
- 門面(facades)
- contracts
- HTTP層
- 路由
- 中間件
- CSRF保護
- 控制器
- 請求
- 響應
- Session
- 表單驗證
- 視圖與模板
- 視圖
- Blade模板
- 本地化
- Javascript與CSS
- 入門指南
- laravel-elixir
- 安全
- 用戶認證
- 用戶授權
- 重置密碼
- API授權
- 加密解密
- 哈希
- 綜合話題
- 廣播系統
- 緩存系統
- 事件系統
- 文件存儲
- 郵件發送
- 消息通知
- 隊列
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- 數據填充
- redis
- Eloquent ORM
- 快速入門
- 模型關聯
- Eloquent集合
- 修改器
- 序列化
- Artisan控制臺
- Artisan 命令行
- 任務調度
- 測試
- 快速入門
- 應用程序測試
- 數據庫測試
- 模擬器
- 官方擴展包
- Cashier交易包
- Envoy 部署工具
- Passport OAuth 認證
- Scout 全文搜索
- Socialite 社交化登錄
- 附錄
- 集合
- 輔助函數
- 擴展包開發
- 交流說明