許多初學(xué)者可能都會(huì)困惑 Laravel 為什么沒有提供 models
目錄,官方解釋說是因?yàn)椴煌藢?duì) models
這個(gè)詞的含義看法不同,容易造成歧義,,有些開發(fā)者認(rèn)為應(yīng)用的模型指的是業(yè)務(wù)邏輯,,另外一些人則認(rèn)為模型指的是與關(guān)聯(lián)數(shù)據(jù)庫(kù)的交互。正是因?yàn)檫@個(gè)原因,,官方默認(rèn)將 Eloquent 的模型直接放置到 app
目錄下,,讓開發(fā)者自行選擇模型放置的位置。
這是 Laravel 框架作者的想法,,不過對(duì)于國(guó)內(nèi)開發(fā)者,,尤其是 PHP 開發(fā)者來(lái)說,models
目錄用于存放與數(shù)據(jù)庫(kù)交互的模型類應(yīng)該沒有什么異議,,而業(yè)務(wù)邏輯應(yīng)該放到 services
這種目錄之下,。所以推薦大家在生成模型類的時(shí)候指定生成到 app/Models
目錄下:
php artisan make:model Models/Test
根目錄
App目錄
app
目錄包含了應(yīng)用的核心代碼,注意不是框架的核心代碼,,框架的核心代碼在 /vendor/laravel/framework
里面,,此外你為應(yīng)用編寫的代碼絕大多數(shù)也會(huì)放到這里,當(dāng)然,,如果你基于 Composer 做了 PHP 組件化開發(fā)的話,,這里面存放的恐怕也只有一些入口性的代碼了;
Bootstrap目錄
bootstrap
目錄包含了少許文件,,用于框架的啟動(dòng)和自動(dòng)載入配置,,還有一個(gè) cache
文件夾,里面包含了框架為提升性能所生成的文件,,如路由和服務(wù)緩存文件,;
Config目錄
config
目錄包含了應(yīng)用所有的配置文件,建議通讀一遍這些配置文件以便熟悉 Laravel 所有默認(rèn)配置項(xiàng),;
Database目錄
database
目錄包含了數(shù)據(jù)庫(kù)遷移文件及填充文件,,如果有使用 SQLite 的話,你還可以將其作為 SQLite 數(shù)據(jù)庫(kù)存放目錄,;
Public目錄
public
目錄包含了應(yīng)用入口文件 index.php
和前端資源文件(圖片,、Javascript、CSS等),,該目錄也是 Apache 或 Nginx 等 Web 服務(wù)器所指向的應(yīng)用根目錄,,這樣做的好處是隔離了應(yīng)用核心文件直接暴露于 Web 根目錄之下,如果權(quán)限系統(tǒng)沒做好或服務(wù)器配置有漏洞的話,,很可能導(dǎo)致應(yīng)用敏感文件被黑客竊取,,進(jìn)而對(duì)網(wǎng)站安全造成威脅;
Resources目錄
resources
目錄包含了應(yīng)用視圖文件和未編譯的原生前端資源文件(LESS,、SASS,、Javascript),以及本地化語(yǔ)言文件;
Routes目錄
routes
目錄包含了應(yīng)用定義的所有路由,。Laravel 默認(rèn)提供了四個(gè)路由文件用于給不同的入口使用:web.php
,、api.php
,、 console.php
和 channels.php
,。
web.php
文件包含的路由都位于 RouteServiceProvider
所定義的 web
中間件組約束之內(nèi),因而支持 Session,、CSRF 保護(hù)以及 cookie 加密功能,,如果應(yīng)用無(wú)需提供無(wú)狀態(tài)的、RESTful 風(fēng)格的 API,,那么路由基本上都要定義在 web.php
文件中,。
api.php
文件包含的路由位于 api
中間件組約束之內(nèi),支持頻率限制功能,,這些路由是無(wú)狀態(tài)的,,所以請(qǐng)求通過這些路由進(jìn)入應(yīng)用需要通過 token 進(jìn)行認(rèn)證并且不能訪問 Session 狀態(tài)。
console.php
文件用于定義所有基于閉包的控制臺(tái)命令,,每個(gè)閉包都被綁定到一個(gè)控制臺(tái)命令并且允許與命令行 IO 方法進(jìn)行交互,,盡管這個(gè)文件并不定義 HTTP 路由,但是它定義了基于控制臺(tái)的應(yīng)用入口(路由),。
channels
文件用于注冊(cè)應(yīng)用支持的所有事件廣播頻道,。
Storage目錄
storage
目錄包含了編譯后的 Blade 模板、基于文件的 Session,、文件緩存,,以及其它由框架生成的文件,該目錄被細(xì)分為成 app
,、framework
和 logs
子目錄,,app
目錄用于存放應(yīng)用生成的文件,framework
目錄用于存放框架生成的文件和緩存,,最后,,logs
目錄存放的是應(yīng)用的日志文件。
storage/app/public
目錄用于存儲(chǔ)用戶生成的文件,,比如可以被公開訪問的用戶頭像,,要達(dá)到被 Web 用戶訪問的目的,你還需要在 public
(應(yīng)用根目錄下的 public
目錄)目錄下生成一個(gè)軟連接 storage
指向這個(gè)目錄,。你可以通過 php artisan storage:link
命令生成這個(gè)軟鏈接,。
Tests目錄
tests
目錄包含自動(dòng)化測(cè)試文件,其中默認(rèn)已經(jīng)提供了一個(gè)開箱即用的PHPUnit 示例,;每一個(gè)測(cè)試類都要以 Test
開頭,,你可以通過 phpunit
或 php vendor/bin/phpunit
命令來(lái)運(yùn)行測(cè)試。
Vendor目錄
vendor
目錄包含了應(yīng)用所有通過 Composer 加載的依賴。
App目錄
應(yīng)用的核心代碼位于 app
目錄下,,默認(rèn)情況下,該目錄位于命名空間 App
下,, 并且被 Composer 通過 PSR-4 自動(dòng)載入標(biāo)準(zhǔn) 自動(dòng)加載,。
app
目錄下包含多個(gè)子目錄,如 Console
,、Http
,、Providers
等。Console
和 Http
目錄提供了進(jìn)入應(yīng)用核心的 API,,HTTP 協(xié)議和 CLI 是和應(yīng)用進(jìn)行交互的兩種機(jī)制,,但實(shí)際上并不包含應(yīng)用邏輯。換句話說,,它們只是兩個(gè)向應(yīng)用發(fā)送命令的方式,。Console
目錄包含了所有開發(fā)者編寫的 Artisan 命令,Http
目錄包含了控制器,、中間件和請(qǐng)求等,。
其他目錄會(huì)在你通過 Artisan 命令 make
生成相應(yīng)類的時(shí)候自動(dòng)生成到 app
目錄下。例如,,app/Jobs
目錄直到你執(zhí)行 make:job
命令生成任務(wù)類時(shí)才會(huì)出現(xiàn)在 app
目錄下,。
注:
app
目錄中的很多類都可以通過 Artisan 命令生成,要查看所有有效的命令,,可以在終端中運(yùn)行php artisan list make
命令,。
Console目錄
Console
目錄包含應(yīng)用所有自定義的 Artisan 命令,這些命令類可以使用 make:command
命令生成,。該目錄下還有 Console/Kernel
類,,在這里可以注冊(cè)自定義的 Artisan 命令以及定義調(diào)度任務(wù)。
Events目錄
這個(gè)目錄默認(rèn)不存在,,但是可以通過 event:generate
和 make:event
命令創(chuàng)建,。該目錄用于存放事件類。事件類用于告知應(yīng)用其他部分某個(gè)事件發(fā)生情況并提供靈活的,、解耦的處理機(jī)制。
Exceptions目錄
Exceptions
目錄包含應(yīng)用的異常處理器,,同時(shí)還是處理應(yīng)用拋出的任何異常的好地方,。
Http目錄
Http
目錄包含了控制器、中間件以及表單請(qǐng)求等,,幾乎所有通過 Web 進(jìn)入應(yīng)用的請(qǐng)求處理都在這里進(jìn)行,。
Jobs目錄
該目錄默認(rèn)不存在,,可以通過執(zhí)行 make:job
命令生成,,Jobs
目錄用于存放隊(duì)列任務(wù),應(yīng)用中的任務(wù)可以被推送到隊(duì)列,,也可以在當(dāng)前請(qǐng)求生命周期內(nèi)同步執(zhí)行,。同步執(zhí)行的任務(wù)有時(shí)也被看作命令,因?yàn)樗鼈儗?shí)現(xiàn)了命令模式,。
Listeners目錄
這個(gè)目錄默認(rèn)不存在,,可以通過執(zhí)行 event:generate
和 make:listener
命令創(chuàng)建,。Listeners
目錄包含處理事件的類(事件監(jiān)聽器),,事件監(jiān)聽器接收一個(gè)事件并提供對(duì)該事件發(fā)生后的響應(yīng)邏輯,例如,,UserRegistered
事件可以被 SendWelcomeEmail
監(jiān)聽器處理,。
Mail目錄
這個(gè)目錄默認(rèn)不存在,但是可以通過執(zhí)行 make:mail
命令生成,,Mail
目錄包含應(yīng)用所有郵件相關(guān)類,,郵件對(duì)象允許你在一個(gè)地方封裝構(gòu)建郵件所需的所有業(yè)務(wù)邏輯,然后使用 Mail::send
方法發(fā)送郵件,。
Notifications目錄
這個(gè)目錄默認(rèn)不存在,,你可以通過執(zhí)行 make:notification
命令連帶創(chuàng)建, Notifications
目錄包含應(yīng)用發(fā)送的所有通知,,比如事件發(fā)生通知,。Laravel 的通知功能將通知發(fā)送和通知驅(qū)動(dòng)解耦,你可以通過郵件,,也可以通過Slack,、短信或者數(shù)據(jù)庫(kù)發(fā)送通知。
Policies目錄
這個(gè)目錄默認(rèn)不存在,,你可以通過執(zhí)行 make:policy
命令生成策略類來(lái)創(chuàng)建,, Policies
目錄包含了應(yīng)用所有的授權(quán)策略類,策略用于判斷某個(gè)用戶是否有權(quán)限去訪問指定資源,。更多詳情,,請(qǐng)查看授權(quán)文檔。
Providers目錄
Providers
目錄包含應(yīng)用的所有服務(wù)提供者,。服務(wù)提供者在應(yīng)用啟動(dòng)過程中綁定服務(wù)到容器,、注冊(cè)事件以及執(zhí)行其他任務(wù)為即將到來(lái)的請(qǐng)求處理做好準(zhǔn)備工作。
在新安裝的 Laravel 應(yīng)用中,,該目錄已經(jīng)包含了一些服務(wù)提供者,,你可以按需添加自己的服務(wù)提供者到該目錄,。
Rules目錄
該目錄默認(rèn)不存在,但是會(huì)伴隨你執(zhí)行 Artisan 命令 make:rule
自動(dòng)生成,。Rules
目錄包含應(yīng)用的自定義驗(yàn)證規(guī)則對(duì)象,,這些規(guī)則用于在單個(gè)對(duì)象中封裝復(fù)雜的驗(yàn)證邏輯,想要了解更多的話,,請(qǐng)參考驗(yàn)證文檔,。