跟我學(xué)Laravel之請(qǐng)求(Request)的生命周期
來(lái)源:易賢網(wǎng) 閱讀:3217 次 日期:2014-10-17 14:09:25
溫馨提示:易賢網(wǎng)小編為您整理了“跟我學(xué)Laravel之請(qǐng)求(Request)的生命周期”,方便廣大網(wǎng)友查閱!

概述

在現(xiàn)實(shí)世界中使用工具時(shí),如果理解了工具的工作原理,使用起來(lái)就會(huì)更加有底氣。應(yīng)用開(kāi)發(fā)也是如此。當(dāng)你理解了開(kāi)發(fā)工具是如何工作的,使用起來(lái)就會(huì)更加自如。這篇文檔的目標(biāo)就是提供一個(gè)高層次的概述,使你對(duì)于Laravel框架的運(yùn)行方式有一個(gè)較好的把握。在更好地了解了整個(gè)框架之后,框架的組件和功能就不再顯得那么神秘,開(kāi)發(fā)起應(yīng)用來(lái)也更加得心應(yīng)手。這篇文檔包含了關(guān)于請(qǐng)求生命周期的高層次概述,以及啟動(dòng)文件和應(yīng)用程序事件的相關(guān)內(nèi)容。

如果你不能立即理解所有的術(shù)語(yǔ),別灰心,可以先有一個(gè)大致的把握,在閱讀文檔其他章節(jié)的過(guò)程中繼續(xù)積累和消化知識(shí)。

請(qǐng)求的生命周期

發(fā)送給應(yīng)用程序的所有請(qǐng)求都經(jīng)由 public/index.php 腳本處理。如果使用的是 Apache 服務(wù)器,Laravel中包含的 .htaccess 文件將對(duì)所有請(qǐng)求進(jìn)行處理并傳遞給 index.php。這是Laravel從接受客戶端請(qǐng)求到返回響應(yīng)給客戶端的整個(gè)過(guò)程的開(kāi)始。若能對(duì)于Laravel的引導(dǎo)過(guò)程(bootstrap process)有一個(gè)大致的認(rèn)識(shí),將有助于理解框架,我們不妨先討論這個(gè)。

到目前為止,學(xué)習(xí)Laravel引導(dǎo)過(guò)程所需掌握的最重要的概念就是 服務(wù)提供器。打開(kāi) app/config/app.php 配置文件,找到 providers 數(shù)組,你會(huì)發(fā)現(xiàn)一個(gè)服務(wù)提供器的列表。這些提供器充當(dāng)了Laravel的主要引導(dǎo)機(jī)制。在我們深入服務(wù)提供器之前,先回到 index.php的討論。當(dāng)一個(gè)請(qǐng)求進(jìn)入 index.php 文件,bootstrap/start.php 文件會(huì)被加載。這個(gè)文件會(huì)創(chuàng)建一個(gè) Laravel Application 對(duì)象,該對(duì)象同時(shí)作為框架的 IoC 容器。

Application 對(duì)象創(chuàng)建完成后,框架會(huì)設(shè)置一些路徑信息并運(yùn)行 環(huán)境檢測(cè) 。然后會(huì)執(zhí)行位于Laravel源碼內(nèi)部的引導(dǎo)腳本,并根據(jù)你的配置文件設(shè)置時(shí)區(qū)、錯(cuò)誤報(bào)告等其他信息。除了配置這些瑣碎的配置選項(xiàng)以外,該腳本還會(huì)做一件非常重要的事情:注冊(cè)所有為應(yīng)用程序配置的服務(wù)提供器。

簡(jiǎn)單的服務(wù)提供器只包含一個(gè)方法:register。當(dāng)應(yīng)用程序?qū)ο笸ㄟ^(guò)自身的 register 方法注冊(cè)某個(gè)服務(wù)提供器時(shí),會(huì)調(diào)用該服務(wù)提供器的 register 方法。服務(wù)提供器通過(guò)這個(gè)方法向 IoC 容器 注冊(cè)一些東西。從本質(zhì)上講,每個(gè)服務(wù)提供器都是將一個(gè)或多個(gè) 閉包 綁定到容器中,你可以通過(guò)這些閉包訪問(wèn)綁定到應(yīng)用程序的服務(wù)。例如,QueueServiceProvider 注冊(cè)了多個(gè)閉包以便使用與 隊(duì)列 相關(guān)的多個(gè)類(lèi)。當(dāng)然,服務(wù)提供器并不局限于向IoC容器注冊(cè)內(nèi)容,而是可以用于任何引導(dǎo)性質(zhì)的任務(wù)。服務(wù)提供器可以注冊(cè)事件監(jiān)聽(tīng)器、視圖合成器、Artisan命令等等。

在注冊(cè)完所有服務(wù)提供器后,app/start 下的文件會(huì)被加載。最后,app/routes.php 文件會(huì)被加載。一旦 routes.php 文件被加載,Request 對(duì)象就被發(fā)送給應(yīng)用程序?qū)ο?,繼而被派發(fā)到某個(gè)路由上。

我們總結(jié)一下:

請(qǐng)求進(jìn)入 public/index.php 文件。

bootstrap/start.php 文件創(chuàng)建應(yīng)用程序?qū)ο蟛z測(cè)環(huán)境。

內(nèi)部的 framework/start.php 文件配置相關(guān)設(shè)置并加載服務(wù)提供器。

加載應(yīng)用程序 app/start 目錄下的文件。

加載應(yīng)用程序的 app/routes.php 文件。

將 Request 對(duì)象發(fā)送給應(yīng)用程序?qū)ο?,?yīng)用程序?qū)ο蠓祷匾粋€(gè) Response 對(duì)象。

將 Response 對(duì)象發(fā)回客戶端。

你應(yīng)該已經(jīng)掌握了 Laravel 應(yīng)用程序是如何處理發(fā)來(lái)的請(qǐng)求的。下面我們來(lái)看一下啟動(dòng)文件。

啟動(dòng)文件

應(yīng)用程序的啟動(dòng)文件被存放在app/start目錄中。默認(rèn)情況下,該目錄下包含三個(gè)文件:global.php、local.php 和 artisan.php文件。需要獲取更多關(guān)于artisan.php的信息,可以參考文檔Artisan 命令行。

global.php啟動(dòng)文件默認(rèn)包含一些基本項(xiàng)目,例如日志的注冊(cè)以及載入app/filters.php 文件。然而,你可以在該文件里做任何你想做的事情。無(wú)論在什么環(huán)境下,它都將會(huì)被自動(dòng)包含進(jìn)_每一個(gè)_request中。而local.php 文件僅在local環(huán)境下被執(zhí)行。獲取更多關(guān)于環(huán)境的信息,請(qǐng)查看文檔配置。

當(dāng)然,如果除了local環(huán)境你還有其他環(huán)境的話,你也可以為針對(duì)這些環(huán)境創(chuàng)建啟動(dòng)文件。這些文件將在應(yīng)用程序運(yùn)行在該環(huán)境中時(shí)被自動(dòng)包含。假設(shè)你在 bootstrap/start.php 文件中配置了一個(gè) development 環(huán)境,你可以創(chuàng)建一個(gè) app/start/development.php 文件,在那個(gè)環(huán)境下任何進(jìn)入應(yīng)用程序的請(qǐng)求都會(huì)包含該文件。

啟動(dòng)文件里存放什么

啟動(dòng)文件主要用來(lái)存放任何“引導(dǎo)”性質(zhì)的代碼。例如,你可以在啟動(dòng)文件中注冊(cè)視圖合成器,配置日志信息,或是進(jìn)行一些PHP設(shè)置等。具體做什么取決于你。當(dāng)然了,把所有引導(dǎo)代碼都丟到啟動(dòng)文件里會(huì)使啟動(dòng)文件變得雜亂。對(duì)于大型應(yīng)用而言,或是啟動(dòng)文件顯得太雜亂了,請(qǐng)考慮將某些引導(dǎo)代碼移至 服務(wù)提供器 中。

應(yīng)用程序事件

你還可以通過(guò)注冊(cè) before、after、finish 和 shutdown應(yīng)用程序事件以便在處理request之前或后做一些操作:

注冊(cè)應(yīng)用程序事件

復(fù)制代碼 代碼如下:

App::before(function($request)

{

//

});

App::after(function($request, $response)

{

//

});

這些事件的監(jiān)聽(tīng)器會(huì)在每個(gè)到達(dá)應(yīng)用程序的請(qǐng)求處理之前(before)或之后(after)運(yùn)行??梢岳眠@些事件來(lái)設(shè)置全局過(guò)濾器(filter),或是對(duì)于發(fā)回客戶端的響應(yīng)(response)統(tǒng)一進(jìn)行修改。你可以在某個(gè)啟動(dòng)文件中或者 服務(wù)提供器 中注冊(cè)這些事件。

當(dāng)來(lái)自應(yīng)用程序的響應(yīng)發(fā)送至客戶端后會(huì)觸發(fā) finish 事件。這個(gè)事件適合處理應(yīng)用程序所需的最后的收尾工作。當(dāng)所有 finish 事件的監(jiān)聽(tīng)器都執(zhí)行完畢后會(huì)立即觸發(fā) shutdown 事件,如果想在腳本結(jié)束前再做一些事情,這是最后的機(jī)會(huì)。不過(guò)在大多數(shù)情況下,你都不需要用到這些事件。

更多信息請(qǐng)查看IT技術(shù)專欄

更多信息請(qǐng)查看腳本欄目
易賢網(wǎng)手機(jī)網(wǎng)站地址:跟我學(xué)Laravel之請(qǐng)求(Request)的生命周期
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢?yōu)闇?zhǔn)!

2026國(guó)考·省考課程試聽(tīng)報(bào)名

  • 報(bào)班類(lèi)型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)