laravel中的$request物件構造及請求生命週期

世有因果知因求果發表於2015-08-02

laravel應用程式中index.php是所有請求的入口。當使用者提交一個form或者訪問一個網頁時,首先由kernel捕捉到該session PHP執行環境下的使用者資料,

生成一個request物件,該物件再傳入routing系統定址到對應的controller,最終由controller形成response返回給瀏覽器,完成整個網頁請求的生命週期。

 

$kernel->handle $request=Illuminate\Http\Request::capture->createFromBase->createFromGlobals->

$request = self::createRequestFromFactory($_GET, $_POST, array(), $_COOKIE, $_FILES, $server);(Symfony\Component\HttpFoundation\Request::createRequestFromFactory

$response = $this->sendRequestThroughRouter($request);   Kernel.php(Illuminate\Foundation\Http\Kernel
$this->app['events']->fire('kernel.handled', [$request, $response]);
return $response;

response->send();

 從上面的簡單分析可以看出,laravel中的請求生命週期分為三個部分:

1. 一個HTTP請求被routed到一個controller(request物件本身的生成過程如上面所描述)

2. controller執行特定的action訪問資料庫獲取資料按照商業邏輯處理後返回到View;

3. View本身將資料做格式化,最終提供HTTP的response到瀏覽器

雖然大體過程如上面描述,但是除此之外,也有很多異常流程並未提及。一個request的整個生命週期可以分為三個部分: Loading, Booting, Running.

loading steps:

 

有三個你的應用能夠影響loading步驟的三個區域:

1)workbench: workbench允許你開發和除錯一個package

2)你可以修改bootstrap/strat.php並且增加你的應用環境檢測;

3)你可以修改bootstrap/paths.php來定製你的應用路徑

Booting steps

有10個你的應用可以影響到booting steps的不同區域:

1. configuration:你的應用配置影響到boot process和laravel的執行;

2.service providers:任何你建立的service provider都將在boot process的早期載入到應用中。如果你的service provider 不被deferred,那麼他的register()方法將在這時呼叫;

3.registering the strat files.你的三個application startup file將在應用的booted 事件發生時被載入

4.handle middleware going down

5.booting service providers, 這時所有non-deferred service provider的boot()函式被呼叫

6.booting callbacks. 任何使用APP::booting()函式註冊的callbacks將被呼叫

7.booted callback. 既然應用已經booted了,那麼任何使用App::booted()函式註冊的回撥將被呼叫。這包括在第三步中用於載入三個application startup檔案的callback

8.Your application start script被呼叫。這時app/start/globals.php檔案。這時任何你希望你的應用在任何request被處理之前所呼叫的。

9.app/start/{environment}.php如果你需要在特定環境下初始化的程式碼可以放到這裡。

10.app/routes.php:你的應用程式的路由。

running steps

1.Maintenance mode:如果你有一個maintenance mode偵聽函式被註冊了,那麼你的listener將在此執行;

2.App "before" filter:

如果你有任何用App::before()來註冊的filter,那麼他們在此執行;

3.Route/Controller "before"filters

如果你有任何在route或者controller level的before filter,則在此執行;

4.action:

這裡是一個controller method或者一個route callback當處理請求是被呼叫;

5.Route/Controller "after" filters:如果你有route或者controller level的after filter,則在這裡被呼叫;

6.App "after" filters.

如果你有任何使用App::after()函式註冊的filter,則在這裡呼叫。任何一個middleware可以在response被返回前來修改它;

7.middleware repsponse handling:

8. middleware shtdown.如果你提供了一個實現了TerminableInterface的middleware,則他的shutdown()

9.Finish callbacks:

如果你有App::finish()註冊的callback,則這時呼叫;

10.shutdown callbacks。最後,如果你有使用App::shutdown()註冊的callback則這時呼叫

http://laravel-recipes.com/recipes/52/understanding-the-request-lifecycle

 

相關文章