單一入口
單一入口的概念其實(shí)很好理解诡渴,我們可以把整個(gè)應(yīng)用想象為一個(gè)黑色的盒子彰檬,整個(gè)盒子只有一個(gè)入口镰烧,這個(gè)入口由一個(gè)文件把守瓷叫,它要求所有的請求必須通過這個(gè)入口文件檢驗(yàn)才能進(jìn)入屯吊。
在聊單一入口的應(yīng)用之前,我們先來看一看傳統(tǒng)應(yīng)用的多入口模式摹菠,這里我們參考一下 ECSHOP 的網(wǎng)站根目錄的部分目錄結(jié)構(gòu):
- article.php 文章內(nèi)容
- article_cat.php文章分類
- auction.php 拍賣前臺文件
- brand.php 品牌列表
- captcha.php 生成驗(yàn)證碼
- catalog.php 列出所以分類及品牌
- category.php 商品分類
- comment.php 提交用戶評論
- compare.php 商品比較程序
- cycle_image.php 輪播圖片程序
- feed.php RSS Feed 生成程序
- flow.php 購物流程
- gallery.php 商品相冊
- goods.php 商品詳情
- goods_script.php 生成商品列表
- group_buy.php 團(tuán)購商品前臺文件
- index.php 首頁文件
- myship.php 支付配送DEMO
- pick_out.php 選購中心
- receive.php 處理收回確認(rèn)的頁面
- index.php 首頁文件
你可以看到上述目錄就是網(wǎng)站的根目錄盒卸,這個(gè)目錄下存放著相應(yīng)頁面的響應(yīng)代碼,如果我們想要訪問首頁次氨,我們就在網(wǎng)址中訪問 index.php
蔽介,如果我們想要訪問商品頁,那么我們就需要訪問 goods.php
文件煮寡,這就是傳統(tǒng)應(yīng)用的多入口模式虹蓄,我們可以通過不同的文件入口來得到應(yīng)用響應(yīng)。
談到這里幸撕,你應(yīng)該意識到了 網(wǎng)站的根目錄
和 應(yīng)用的根目錄
是兩個(gè)不同的定義薇组,我們還是回到 Laravel 中吧,Laravel 應(yīng)用的根目錄下包含了多個(gè)目錄坐儿,其目錄結(jié)構(gòu)如下:
- app
- bootstrap
- config
- database
- public
- index.php
- resources
- storage
- tests
- vendor
這其中 public
目錄才是網(wǎng)站的根目錄律胀,index.php
就是整個(gè)應(yīng)用的守衛(wèi)宋光,它需要視察所有進(jìn)入應(yīng)用的請求。
單一入口的優(yōu)勢
聊到這里炭菌,你一定會有所疑惑罪佳,Laravel 為何要采用單一入口的模式,這種單一入口有什么優(yōu)勢黑低?ok赘艳,別著急,我們將會一一談起投储。
如果說這種單一入口目錄結(jié)構(gòu)的優(yōu)勢第练,那么我們不得不提及應(yīng)用核心代碼與靜態(tài)資源的分離,你看玛荞,使用這種方式,我們可以非常完美的將服務(wù)端核心代碼與靜態(tài)資源完全分離開來呕寝,這就意味著如果你想要訪問 public
目錄外的資源都必須要經(jīng)過守衛(wèi)的審查勋眯。這就為統(tǒng)一的安全性提供了便利。
我曾經(jīng)見到過這么一個(gè)有趣的情況下梢,某人在 ECSHOP 程序的配置文件目錄下拷貝了一份配置并重命名為 config.php.bak
客蹋,原意可能是為了防止自己忘記數(shù)據(jù)庫的密碼,但是這就意味著任何用戶都可以通過瀏覽器訪問到這個(gè)文件了孽江,因?yàn)閷τ?Nginx 或者 Apache 來說這些 HTTP 請求只要路徑正確讶坯,如果不是 PHP 程序的話,他們就會以靜態(tài)資源的方式進(jìn)行輸出岗屏,當(dāng)然辆琅,這只是個(gè)個(gè)例,但卻足以讓你明白動(dòng)靜分離的好處了这刷。
那么我們現(xiàn)在穿透到黑盒的內(nèi)部看一下婉烟,如果說黑盒是一個(gè)工廠,守衛(wèi)把一個(gè)請求交由工廠來處理暇屋,那么它一定需要通過一定的流程來產(chǎn)出一個(gè)響應(yīng)似袁。那么它的流程一般是這樣的:
- 初始化應(yīng)用所需的模塊資源
- 根據(jù)不同的請求類型將其導(dǎo)向相應(yīng)的業(yè)務(wù)
- 業(yè)務(wù)處理
- 返回響應(yīng)
那么我們應(yīng)該可以看出,其實(shí)單一入口最大的優(yōu)勢就是規(guī)范了開發(fā)流程咐刨。
我們可能很難想象規(guī)范化的流程能帶來多大的開發(fā)效率上的提升昙衅,但是它確實(shí)能最大化的提升效率。還記得 DRY(Don't Repeat Yourself)
原則嗎定鸟?
基于傳統(tǒng)的多入口應(yīng)用中而涉,如果我們想要保存一個(gè)用戶的認(rèn)證狀態(tài),那么我們一定會使用服務(wù)端的 session 功能仔粥。所以你會在這些應(yīng)用的每個(gè)牽涉到用戶相關(guān)的入口頁面的 PHP 文件中發(fā)現(xiàn)被引入了相關(guān)的 session 實(shí)現(xiàn)婴谱。這樣蟹但,每次我們增加一個(gè)頁面就要手動(dòng)的引入一次,這完全背離的 DRY 原則谭羔。
而在單入口應(yīng)用中华糖,如果抽象度非常高的話,那么我們完全可以把 session 實(shí)現(xiàn)抽象為其中的一個(gè)中間件瘟裸,這樣客叉,我們也完全可以在請求被守衛(wèi)進(jìn)行分發(fā)時(shí)由程序自動(dòng)的判斷是否需要啟用 session 功能,這完全可以是自動(dòng)化的兼搏。
再比如說佛呻,如果我們想對應(yīng)用的請求啟用日志功能,那么基于傳統(tǒng)的多入口應(yīng)用病线,我們需要在每一個(gè)入口中都加入日志功能吓著,才能達(dá)到記錄所有日志的效果,而在單入口應(yīng)用中我們只需要添加一個(gè)日志中間件就可以讓它來記錄所有的日志了纺裁。
你能想象的到嗎,對于多入口的應(yīng)用每當(dāng)我增加一個(gè)入口頁面時(shí)浪南,我一定不能忘記引入基層的組件庫。
PS: 歡迎關(guān)注簡書 Laravel 專題,也歡迎 Laravel 相關(guān)文章的投稿 :)