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