Laravel5 源碼解析
autoload.php 用的是composer的autoload
這裡就不做說明了
app.php 啟動整個項目
首先看下Application這個類
class Application extends Container implements ApplicationContract, HttpKernelInterface
Container中方法很多,實現了ArrayAccess,主要方法都是是用於綁定對象的(利於重用)。
ApplicationContract 需要實現註冊service provider。
HttpKernelInterface 就一個handle方法,接受一個Request, 返回一個Response。
Application的構造方法
registerBaseBindings()
把app對象自身綁定到instance屬性數組。
registerBaseServiceProviders()
註冊兩個service provider, 一個是EventServiceProvider,註冊一個單例Dispatcher,名字為’events’(TODO),另一個是RoutingServiceProvider(), 包含了Router, RouterGenerator, Redirector, ResponseFactory, 構造ResponseFactory接受兩個參數,一個是ViewFactory,一個是Redirecer
registerCoreContainerAliases(), 把一系列key和對應的類名,介面名加入alias屬性數組
'app' => ['Illuminate\Foundation\Application', 'Illuminate\Contracts\Container\Container', 'Illuminate\Contracts\Foundation\Application']
‘app’是key, 數組中的三個是別名(猜測:估計是每當用app?>make(′Illuminate\Foundation\Application′),都會返回app[‘app’])
構造完App後開始建立重要的instance
在app容器中共用一個App\Http\Kernel單例。
看一下這個類,繼承了一個Illuminate\Foundation\Http\Kernel,實現了bootstrap, handle, terminate, getApplication這四個方法,可以想象,當收到request時候,流程就是前三個依次執行,非常簡化。
protected $bootstrappers數組,包含了bootstrap的一系列啟動項目。
他的__construct接受兩個參數,一個Application,一個Router。需要再看一下$app->singleton是如何初始化他的,莫非已經包含了IoC的功能?(TODO)
這裡先假設這兩個參數已經被正確傳入了。接著,立即把protected $routeMiddleware中的給router的middleware方法調用。middleware方法只是把key和Class名稱加入到router的middleware屬性數組中。
在app容器中共用一個App\Console\Kernel單例。
繼承自Illuminate\Foundation\Console\Kernal。他的構造方法接受一個app,一個Dispatcherevent。並且設定了一個scheduler,用於每隔一個時間段執行任務。protected $commands屬性和protected function schedule方法都是用來重寫的。
在app容器中共用一個App\Exceptions\Handler單例。
繼承自Illuminate\Foundation\Exceptions\Handler。他的構造方法接受一格Psr\Log\LoggerInterface。
至此,app算是構造完成。接下來就要調用他的方法了。
調用Application
kernel=app->make(‘Illuminate\Contracts\Http\Kernel’);
response=kernel->handle(
$request = Illuminate\Http\Request::capture()
);
$response->send();
kernel?>terminate(request, $response);
這裡的代碼非常明確,首先make一個Kernal,之前已經將其綁定為singleton了。然後kernal handle一個request, 得到一個response, response調用send方法,最後kernal terminate。這裡只是一個高緯度的概括,具體其中實現的方法,還需要進一步深入。
看到這裡,我的感覺是,整個項目最重要的部分就是$app這個容器,或者說Container這個類,綁定的是什麼(Closure),有哪些Binder 方法,各個方法的作用是什麼,make 和 build有什麼區別,alias的作用是什麼,等。瞭解了這些,對寫架構會有協助。
以上就介紹了Laravel5 源碼解析 (一),包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。