首頁  >  文章  >  後端開發  >  Laravel5 原始碼解析 (一)

Laravel5 原始碼解析 (一)

WBOY
WBOY原創
2016-08-08 09:25:151119瀏覽

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




  1. D
  2. i


    spatch event。並且設定了一個scheduler,用於每隔一個時間段執行任務。 protected $commands屬性和protected function schedule方法都是用來重寫的。

  3. 在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教程有兴趣的朋友有所帮助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn