概述
在現(xiàn)實世界中使用工具時,如果理解了工具的工作原理,使用起來就會更加有底氣。應用開發(fā)也是如此。當你理解了開發(fā)工具是如何工作的,使用起來就會更加自如。這篇文檔的目標就是提供一個高層次的概述,使你對于Laravel框架的運行方式有一個較好的把握。在更好地了解了整個框架之后,框架的組件和功能就不再顯得那么神秘,開發(fā)起應用來也更加得心應手。這篇文檔包含了關(guān)于請求生命周期的高層次概述,以及啟動文件和應用程序事件的相關(guān)內(nèi)容。
如果你不能立即理解所有的術(shù)語,別灰心,可以先有一個大致的把握,在閱讀文檔其他章節(jié)的過程中繼續(xù)積累和消化知識。
請求的生命周期
發(fā)送給應用程序的所有請求都經(jīng)由 public/index.php 腳本處理。如果使用的是 Apache 服務(wù)器,Laravel中包含的 .htaccess 文件將對所有請求進行處理并傳遞給 index.php。這是Laravel從接受客戶端請求到返回響應給客戶端的整個過程的開始。若能對于Laravel的引導過程(bootstrap process)有一個大致的認識,將有助于理解框架,我們不妨先討論這個。
到目前為止,學習Laravel引導過程所需掌握的最重要的概念就是 服務(wù)提供器。打開 app/config/app.php 配置文件,找到 providers 數(shù)組,你會發(fā)現(xiàn)一個服務(wù)提供器的列表。這些提供器充當了Laravel的主要引導機制。在我們深入服務(wù)提供器之前,先回到 index.php的討論。當一個請求進入 index.php 文件,bootstrap/start.php 文件會被加載。這個文件會創(chuàng)建一個 Laravel Application 對象,該對象同時作為框架的 IoC 容器。
Application 對象創(chuàng)建完成后,框架會設(shè)置一些路徑信息并運行 環(huán)境檢測 。然后會執(zhí)行位于Laravel源碼內(nèi)部的引導腳本,并根據(jù)你的配置文件設(shè)置時區(qū)、錯誤報告等其他信息。除了配置這些瑣碎的配置選項以外,該腳本還會做一件非常重要的事情:注冊所有為應用程序配置的服務(wù)提供器。
簡單的服務(wù)提供器只包含一個方法:register。當應用程序?qū)ο笸ㄟ^自身的 register 方法注冊某個服務(wù)提供器時,會調(diào)用該服務(wù)提供器的 register 方法。服務(wù)提供器通過這個方法向 IoC 容器 注冊一些東西。從本質(zhì)上講,每個服務(wù)提供器都是將一個或多個 閉包 綁定到容器中,你可以通過這些閉包訪問綁定到應用程序的服務(wù)。例如,QueueServiceProvider 注冊了多個閉包以便使用與 隊列 相關(guān)的多個類。當然,服務(wù)提供器并不局限于向IoC容器注冊內(nèi)容,而是可以用于任何引導性質(zhì)的任務(wù)。服務(wù)提供器可以注冊事件監(jiān)聽器、視圖合成器、Artisan命令等等。
在注冊完所有服務(wù)提供器后,app/start 下的文件會被加載。最后,app/routes.php 文件會被加載。一旦 routes.php 文件被加載,Request 對象就被發(fā)送給應用程序?qū)ο?,繼而被派發(fā)到某個路由上。
我們總結(jié)一下:
請求進入 public/index.php 文件。
bootstrap/start.php 文件創(chuàng)建應用程序?qū)ο蟛z測環(huán)境。
內(nèi)部的 framework/start.php 文件配置相關(guān)設(shè)置并加載服務(wù)提供器。
加載應用程序 app/start 目錄下的文件。
加載應用程序的 app/routes.php 文件。
將 Request 對象發(fā)送給應用程序?qū)ο?,應用程序?qū)ο蠓祷匾粋€ Response 對象。
將 Response 對象發(fā)回客戶端。
你應該已經(jīng)掌握了 Laravel 應用程序是如何處理發(fā)來的請求的。下面我們來看一下啟動文件。
啟動文件
應用程序的啟動文件被存放在app/start目錄中。默認情況下,該目錄下包含三個文件:global.php、local.php 和 artisan.php文件。需要獲取更多關(guān)于artisan.php的信息,可以參考文檔Artisan 命令行。
global.php啟動文件默認包含一些基本項目,例如日志的注冊以及載入app/filters.php 文件。然而,你可以在該文件里做任何你想做的事情。無論在什么環(huán)境下,它都將會被自動包含進_每一個_request中。而local.php 文件僅在local環(huán)境下被執(zhí)行。獲取更多關(guān)于環(huán)境的信息,請查看文檔配置。
當然,如果除了local環(huán)境你還有其他環(huán)境的話,你也可以為針對這些環(huán)境創(chuàng)建啟動文件。這些文件將在應用程序運行在該環(huán)境中時被自動包含。假設(shè)你在 bootstrap/start.php 文件中配置了一個 development 環(huán)境,你可以創(chuàng)建一個 app/start/development.php 文件,在那個環(huán)境下任何進入應用程序的請求都會包含該文件。
啟動文件里存放什么
啟動文件主要用來存放任何“引導”性質(zhì)的代碼。例如,你可以在啟動文件中注冊視圖合成器,配置日志信息,或是進行一些PHP設(shè)置等。具體做什么取決于你。當然了,把所有引導代碼都丟到啟動文件里會使啟動文件變得雜亂。對于大型應用而言,或是啟動文件顯得太雜亂了,請考慮將某些引導代碼移至 服務(wù)提供器 中。
應用程序事件
你還可以通過注冊 before、after、finish 和 shutdown應用程序事件以便在處理request之前或后做一些操作:
注冊應用程序事件
復制代碼 代碼如下:
App::before(function($request)
{
//
});
App::after(function($request, $response)
{
//
});
這些事件的監(jiān)聽器會在每個到達應用程序的請求處理之前(before)或之后(after)運行。可以利用這些事件來設(shè)置全局過濾器(filter),或是對于發(fā)回客戶端的響應(response)統(tǒng)一進行修改。你可以在某個啟動文件中或者 服務(wù)提供器 中注冊這些事件。
當來自應用程序的響應發(fā)送至客戶端后會觸發(fā) finish 事件。這個事件適合處理應用程序所需的最后的收尾工作。當所有 finish 事件的監(jiān)聽器都執(zhí)行完畢后會立即觸發(fā) shutdown 事件,如果想在腳本結(jié)束前再做一些事情,這是最后的機會。不過在大多數(shù)情況下,你都不需要用到這些事件。
更多信息請查看IT技術(shù)專欄