Laravel5 原始碼解析
autoload.php 用的是composer的autoload
這裡就不做說明了
app.php 啟動整個專案
首先看下Applipmple,這個類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' => ['IlluminateFoundationApplication', 'Illinate'
'app'是key, 陣列中的三個是別名(猜測:估計是每當用
ap ke(′ umina teFoundationApplicationApplication ,都會返回 app['app'])構造完App後開始創建重要的instance在app容器中共用一個AppHttpKernel單例。
看一下這個類,繼承了一個IlluminateFoundationHttpKernel,實現了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容器中共用一個AppConsoleKernel單例。
繼承自IlluminateFoundationConsoleKernal。他的構造方法接受一個
a
p
p
-
個
D
- i
s
patch event。並且設定了一個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),有哪些绑定方法,各个方法的作用是什么,make 和 build有什么区别,alias的作用是什么,等。了解了这些,对写框架会有帮助。
以上就介绍了Laravel5 源码解析 (一),包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。