<article><h1>Laravel 的文件夾結構</h1><ul><li><a href="#introduction">簡介</a></li><li><a href="#the-root-directory">根目錄</a><ul><li><a href="#the-root-app-directory"><code class=" language-php">app</code> 目錄</a></li><li><a href="#the-bootstrap-directory"><code class=" language-php">bootstrap</code> 目錄</a></li><li><a href="#the-config-directory"><code class=" language-php">config</code> 目錄</a></li><li><a href="#the-database-directory"><code class=" language-php">database</code> 目錄</a></li><li><a href="#the-public-directory"><code class=" language-php"><span class="token keyword">public</span></code> 目錄</a></li><li><a href="#the-resources-directory"><code class=" language-php">resources</code> 目錄</a></li><li><a href="#the-routes-directory"><code class=" language-php">routes</code> 目錄</a></li><li><a href="#the-storage-directory"><code class=" language-php">storage</code> 目錄</a></li><li><a href="#the-tests-directory"><code class=" language-php">tests</code> 目錄</a></li><li><a href="#the-vendor-directory"><code class=" language-php">vendor</code> 目錄</a></li></ul></li><li><a href="#the-app-directory">App 目錄</a><ul><li><a href="#the-console-directory"><code class=" language-php">Console</code> 目錄</a></li><li><a href="#the-events-directory"><code class=" language-php">Events</code> 目錄</a></li><li><a href="#the-exceptions-directory"><code class=" language-php">Exceptions</code> 目錄</a></li><li><a href="#the-http-directory"><code class=" language-php">Http</code> 目錄</a></li><li><a href="#the-jobs-directory"><code class=" language-php">Jobs</code> 目錄</a></li><li><a href="#the-listeners-directory"><code class=" language-php">Listeners</code> 目錄</a></li><li><a href="#the-mail-directory"><code class=" language-php">Mail</code> 目錄</a></li><li><a href="#the-notifications-directory"><code class=" language-php">Notifications</code> 目錄</a></li><li><a href="#the-policies-directory"><code class=" language-php">Policies</code> 目錄</a></li><li><a href="#the-providers-directory"><code class=" language-php">Providers</code> 目錄</a></li></ul></li></ul><p><a name="introduction"></a></p><h2><a href="#introduction">簡介</a></h2><p><code class=" language-php">Laravel</code> 默認的目錄結構意在為構建不同大小的應用提供一個好的起點,當然,你可以自己按照喜好組織應用目錄結構,<code class=" language-php">Laravel</code> 對類在何處被加載沒有任何限制 -- 只要 <code class=" language-php">Composer</code> 可以自動載入它們即可。</p><h4>為什么沒有 <code class=" language-php">Models</code> 目錄?</h4><p>許多初學者都會困惑 Laravel 為什么沒有 <code class=" language-php">models</code> 目錄,當然,這是 laravel 故意為之,因為 <code class=" language-php">models</code> 這個詞對不同開發者而言有不同的含義,容易造成歧義,有些開發者認為應用的模型指的是業務邏輯,還有些開發者則認為模型指的是與關聯數據庫的交互。</p><p>正是因為如此,我們默認將 Eloquent 的模型放置到 <code class=" language-php">app</code> 目錄下,從而允許開發者自行選擇放置的位置。</p><p><a name="the-root-directory"></a></p><h2><a href="#the-root-directory">根目錄</a></h2><p><a name="the-root-app-directory"></a></p><h4><code class=" language-php">app</code> 目錄</h4><p><code class=" language-php">app</code> 目錄,如你所料,這里面包含應用程序的核心代碼。另外,你為應用編寫的代碼絕大多數也會放到這里, 我們之后將很快對這個目錄的細節進行深入探討。</p><p><a name="the-bootstrap-directory"></a></p><h4><code class=" language-php">bootstrap</code> 目錄</h4><p><code class=" language-php">bootstrap</code>目錄包含了幾個框架啟動和自動加載設置的文件。<code class=" language-php">cache</code> 文件夾用于包含框架為提升性能所生成的文件,如路由和服務緩存文件。</p><p><a name="the-config-directory"></a></p><h4><code class=" language-php">config</code> 目錄</h4><p><code class=" language-php">config</code> 目錄,顧名思義,包含所有應用程序的配置文件。通讀這些配置文件可以應對自己對配置修改的需求。</p><p><a name="the-database-directory"></a></p><h4><code class=" language-php">database</code> 目錄</h4><p><code class=" language-php">database</code> 目錄包含了數據遷移及填充文件,你還可以將其作為 SQLite 數據庫的存放目錄。</p><p><a name="the-public-directory"></a></p><h4><code class=" language-php"><span class="token keyword">public</span></code> 目錄</h4><p><code class=" language-php"><span class="token keyword">public</span></code> 目錄包含了 Laravel 的 HTTP 入口文件 <code class=" language-php">index<span class="token punctuation">.</span>php</code> 和前端資源文件(圖片、JavaScript、CSS等)。</p><p><a name="the-resources-directory"></a></p><h4><code class=" language-php">resources</code> 目錄</h4><p><code class=" language-php">resources</code> 目錄包含了視圖、原始的資源文件 (LESS、SASS、CoffeeScript) ,以及語言包。</p><p><a name="the-routes-directory"></a></p><h4><code class=" language-php">routes</code> 目錄</h4><p><code class=" language-php">routes</code> 目錄包含了應用的所有路由定義。Laravel 默認提供了三個路由文件:<code class=" language-php">web<span class="token punctuation">.</span>php</code>, <code class=" language-php">api<span class="token punctuation">.</span>php</code>, 和 <code class=" language-php">console<span class="token punctuation">.</span>php</code>。</p><p><code class=" language-php">web<span class="token punctuation">.</span>php</code> 文件里定義的路由都會在 <code class=" language-php">RouteServiceProvider</code> 中被指定應用到 <code class=" language-php">web</code> 中間件組,具備 Session 、CSRF 防護以及 Cookie 加密功能,如果應用無需提供無狀態的、RESTful 風格的API,所有路由都會定義在 <code class=" language-php">web<span class="token punctuation">.</span>php</code> 文件。</p><p><code class=" language-php">api<span class="token punctuation">.</span>php</code> 文件里定義的路由都會在 <code class=" language-php">RouteServiceProvider</code> 中被指定應用到 <code class=" language-php">api</code> 中間件組,具備頻率限制功能,這些路由是無狀態的,所以請求通過這些路由進入應用需要通過 API 令牌進行認證并且不能訪問 Session 狀態。</p><p><code class=" language-php">console<span class="token punctuation">.</span>php</code> 文件用于定義所有基于閉包的控制臺命令,每個閉包都被綁定到一個控制臺命令并且允許與命令行 IO 方法進行交互,盡管這個文件并不定義 HTTP 路由,但是它定義了基于命令行的應用入口(路由)。</p><p><a name="the-storage-directory"></a></p><h4><code class=" language-php">storage</code> 目錄</h4><p><code class=" language-php">storage</code> 目錄包含編譯后的 Blade 模板、基于文件的 session、文件緩存和其它框架生成的文件。此文件夾分格成 <code class=" language-php">app</code> 、<code class=" language-php">framework</code> ,及 <code class=" language-php">logs</code> 目錄。<code class=" language-php">app</code> 目錄可用于存儲應用程序使用的任何文件。<code class=" language-php">framework</code> 目錄被用于保存框架生成的文件及緩存。最后,<code class=" language-php">logs</code> 目錄包含了應用程序的日志文件。</p><p><code class=" language-php">storage<span class="token operator">/</span>app<span class="token operator">/</span><span class="token keyword">public</span></code> 可以用來存儲用戶生成的文件,例如頭像文件,這是一個公開的目錄。你還需要在 <code class=" language-php"><span class="token keyword">public</span><span class="token operator">/</span>storage</code> 目錄下生成一個軟連接指向這個目錄,你可以使用 <code class=" language-php">php artisan storage<span class="token punctuation">:</span>link</code> 來創建軟鏈接。</p><p><a name="the-tests-directory"></a></p><h4><code class=" language-php">tests</code> 目錄</h4><p><code class=" language-php">tests</code> 目錄包含自動化測試。Laravel 推薦了一個 <a href="https://phpunit.de/">PHPUnit</a> 例子。每一個測試類都需要添加 <code class=" language-php">Test</code> 前綴,你可以使用 <code class=" language-php">phpunit</code> 或者 <code class=" language-php">php vendor<span class="token operator">/</span>bin<span class="token operator">/</span>phpunit</code> 命令來運行測試。</p><p><a name="the-vendor-directory"></a></p><h4><code class=" language-php">vendor</code> 目錄</h4><p><code class=" language-php">vendor</code> 目錄包含所有 <a href="https://getcomposer.org">Composer</a> 依賴。</p><p><a name="the-app-directory"></a></p><h2><a href="#the-app-directory"><code class=" language-php">app</code> 目錄</a></h2><p>應用的核心代碼位于 <code class=" language-php">app</code> 目錄下,默認情況下,該目錄位于命名空間 <code class=" language-php">App</code> 下, 并且被 Composer 通過 <a href="http://www.php-fig.org/psr/psr-4/">PSR-4</a> 自動載入標準 自動加載。</p><p><code class=" language-php">app</code> 目錄下包含多個子目錄,如 <code class=" language-php">Console</code> 、<code class=" language-php">Http</code> 、<code class=" language-php">Providers</code> 等。 其中 <code class=" language-php">Console</code> 和 <code class=" language-php">Http</code> 目錄為進入應用程序核心提供了一個 API 。HTTP 協議和 CLI 是和應用進行交互的兩種機制,但實際上并不包含應用邏輯。換句話說,它們是兩種簡單地發布命令給應用程序的方法。<code class=" language-php">Console</code> 目錄包含你全部的 Artisan 命令,而 <code class=" language-php">Http</code> 目錄包含你的控制器、中間件和請求。</p><p>其他目錄將會在你通過 Artisan 命令 make 生成相應類的時候生成到 <code class=" language-php">app</code> 目錄下。例如,<code class=" language-php">app<span class="token operator">/</span>Jobs</code> 目錄在你執行 <code class=" language-php">make<span class="token punctuation">:</span>job</code> 命令生成任務類時,才會出現在 <code class=" language-php">app</code> 目錄下。</p><blockquote class="has-icon tip"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="56.6px" height="87.5px" viewBox="0 0 56.6 87.5" enable-background="new 0 0 56.6 87.5" xml:space="preserve"><path fill="#FFFFFF" d="M28.7 64.5c-1.4 0-2.5-1.1-2.5-2.5v-5.7 -5V41c0-1.4 1.1-2.5 2.5-2.5s2.5 1.1 2.5 2.5v10.1 5 5.8C31.2 63.4 30.1 64.5 28.7 64.5zM26.4 0.1C11.9 1 0.3 13.1 0 27.7c-0.1 7.9 3 15.2 8.2 20.4 0.5 0.5 0.8 1 1 1.7l3.1 13.1c0.3 1.1 1.3 1.9 2.4 1.9 0.3 0 0.7-0.1 1.1-0.2 1.1-0.5 1.6-1.8 1.4-3l-2-8.4 -0.4-1.8c-0.7-2.9-2-5.7-4-8 -1-1.2-2-2.5-2.7-3.9C5.8 35.3 4.7 30.3 5.4 25 6.7 14.5 15.2 6.3 25.6 5.1c13.9-1.5 25.8 9.4 25.8 23 0 4.1-1.1 7.9-2.9 11.2 -0.8 1.4-1.7 2.7-2.7 3.9 -2 2.3-3.3 5-4 8L41.4 53l-2 8.4c-0.3 1.2 0.3 2.5 1.4 3 0.3 0.2 0.7 0.2 1.1 0.2 1.1 0 2.2-0.8 2.4-1.9l3.1-13.1c0.2-0.6 0.5-1.2 1-1.7 5-5.1 8.2-12.1 8.2-19.8C56.4 12 42.8-1 26.4 0.1zM43.7 69.6c0 0.5-0.1 0.9-0.3 1.3 -0.4 0.8-0.7 1.6-0.9 2.5 -0.7 3-2 8.6-2 8.6 -1.3 3.2-4.4 5.5-7.9 5.5h-4.1H28h-0.5 -3.6c-3.5 0-6.7-2.4-7.9-5.7l-0.1-0.4 -1.8-7.8c-0.4-1.1-0.8-2.1-1.2-3.1 -0.1-0.3-0.2-0.5-0.2-0.9 0.1-1.3 1.3-2.1 2.6-2.1H41C42.4 67.5 43.6 68.2 43.7 69.6zM37.7 72.5H26.9c-4.2 0-7.2 3.9-6.3 7.9 0.6 1.3 1.8 2.1 3.2 2.1h4.1 0.5 0.5 3.6c1.4 0 2.7-0.8 3.2-2.1L37.7 72.5z"></path></svg></span></div> <code class=" language-php">app</code> 目錄中的很多類都可以通過 Artisan 命令生成,要查看所有有效的命令,可以在終端中運行 <code class=" language-php">php artisan list make</code> 命令。</p></blockquote><p><a name="the-console-directory"></a></p><h4><code class=" language-php">Console</code> 目錄</h4><p><code class=" language-php">Console</code> 目錄包含應用所有自定義的 Artisan 命令,這些命令類可以使用 <code class=" language-php">make<span class="token punctuation">:</span>command</code> 命令生成。該目錄下還有 Console Kernel 類,在這里可以注冊自定義的 Artisan 命令以及定義<a href="/docs/5.4/scheduling">調度任務</a>。</p><p><a name="the-events-directory"></a></p><h4><code class=" language-php">Events</code> 目錄</h4><p><code class=" language-php">Events</code> 目錄默認不存在,它會在你使用 <code class=" language-php">event<span class="token punctuation">:</span>generate</code> 或者 <code class=" language-php">event<span class="token punctuation">:</span>make</code> 命令以后才會生成。如你所料,此目錄是用來放置 <a href="/docs/5.4/events">事件類</a> 的。事件類用于當指定事件發生時,通知應用程序的其它部分,并提供了很棒的靈活性及解耦。</p><p><a name="the-exceptions-directory"></a></p><h4><code class=" language-php">Exceptions</code> 目錄</h4><p><code class=" language-php">Exceptions</code> 目錄包含應用的異常處理,同時還是處理應用拋出的任何異常的好位置。如果你想自定義異常的記錄和渲染,你應該修改此目錄下的 Handler 類。</p><p><a name="the-http-directory"></a></p><h4><code class=" language-php">Http</code> 目錄</h4><p><code class=" language-php">Http</code> 目錄包含了控制器、中間件以及表單請求等,幾乎所有進入應用的請求處理都在這里進行。</p><p><a name="the-jobs-directory"></a></p><h4><code class=" language-php">Jobs</code> 目錄</h4><p><code class=" language-php">Jobs</code> 目錄默認不存在,可以通過執行 <code class=" language-php">make<span class="token punctuation">:</span>job</code> 命令生成,<code class=" language-php">Jobs</code> 目錄用于存放 <a href="/docs/5.4/queues">隊列任務</a>,應用中的任務可以推送到隊列,也可以在當前請求生命周期內同步執行。同步執行的任務有時也被看作命令,因為它們實現了 <a href="https://en.wikipedia.org/wiki/Command_pattern">命令總線設計模式</a>。</p><p><a name="the-listeners-directory"></a></p><h4><code class=" language-php">Listeners</code> 目錄</h4><p><code class=" language-php">Listeners</code> 目錄默認不存在,可以通過執行 <code class=" language-php">event<span class="token punctuation">:</span>generate</code> 和 <code class=" language-php">make<span class="token punctuation">:</span>listener</code> 命令創建。<code class=" language-php">Listeners</code> 目錄包含處理 <a href="/docs/5.4/events">事件</a> 的類(事件監聽器),事件監聽器接收一個事件并提供對該 事件發生后的響應邏輯,例如,<code class=" language-php">UserRegistered</code> 事件可以被 <code class=" language-php">SendWelcomeEmail</code> 監聽器處理。</p><p><a name="the-mail-directory"></a></p><h4><code class=" language-php">Mail</code> 目錄</h4><p><code class=" language-php">Mail</code> 目錄默認不存在,但是可以通過執行 <code class=" language-php">make<span class="token punctuation">:</span>mail</code> 命令生成,<code class=" language-php">Mail</code> 目錄包含郵件發送類,郵件對象允許你在一個地方封裝構建郵件所需的所有業務邏輯,然后使用 <code class=" language-php"><span class="token scope">Mail<span class="token punctuation">::</span></span>send</code> 方法發送郵件。</p><p><a name="the-notifications-directory"></a></p><h4><code class=" language-php">Notifications</code> 目錄</h4><p><code class=" language-php">Notifications</code> 目錄默認不存在,你可以通過執行 <code class=" language-php">make<span class="token punctuation">:</span>notification</code> 命令創建, <code class=" language-php">Notifications</code> 目錄包含應用發送的所有通知,比如事件發生通知。Laravel 的通知功能將通知發送和通知驅動解耦,你可以通過郵件,也可以通過 Slack、短信或者數據庫發送通知。</p><p><a name="the-policies-directory"></a></p><h4><code class=" language-php">Policies</code> 目錄</h4><p><code class=" language-php">Policies</code> 你可以通過執行 ·make:policy· 命令來創建, ·Policies· 目錄包含了所有的授權策略類,策略用于判斷某個用戶是否有權限去訪問指定資源。更多詳情,請查看 <a href="/docs/5.4/authorization">授權文檔</a>。</p><p><a name="the-providers-directory"></a></p><h4><code class=" language-php">Providers</code> 目錄</h4><p><code class=" language-php">Providers</code> 目錄包含應用的 <a href="/docs/5.4/providers">服務提供者</a> 。服務提供者在啟動應用過程中綁定服務到容器、注冊事件,以及執行其他任務,為即將到來的請求處理做準備。</p><p>在新安裝的 Laravel 應用中,該目錄已經包含了一些服務提供者,你可以按需添加自己的服務提供者到該目錄。</p></article>
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- 請求周期
- 開發環境部署
- Valet
- Homestead
- 核心概念
- 服務提供者
- Facades
- Contracts
- 服務容器
- HTTP 層
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- Session
- 表單驗證
- 前端
- Blade 模板
- 本地化
- 前端指南
- 編輯資源 Mix
- 安全
- API 認證
- 用戶認證
- 用戶授權
- 加密解密
- 哈希
- 重置密碼
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- Redis
- 數據填充
- Eloquent ORM
- Eloquent ORM快速入門
- 模型關聯
- Eloquent 集合
- 修改器
- 序列化
- 綜合話題
- Artisan 命令行
- 廣播系統
- 緩存系統
- 集合
- 錯誤與日志
- 事件系統
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度