Laravel5 源碼解析 (一)

來源:互聯網
上載者:User
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

  1. 在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屬性數組中。

  2. 在app容器中共用一個App\Console\Kernel單例。
    繼承自Illuminate\Foundation\Console\Kernal。他的構造方法接受一個app,一個Dispatcherevent。並且設定了一個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),有哪些Binder 方法,各個方法的作用是什麼,make 和 build有什麼區別,alias的作用是什麼,等。瞭解了這些,對寫架構會有協助。

以上就介紹了Laravel5 源碼解析 (一),包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.