laravel 5.1 源碼閱讀

laravel相似其餘php框架,採用了單一入口,入口文件爲 /public/index.phpphp

/public/index.php主要作了如下幾件事:laravel

  • 引用 /bootstrap/autoload.php, 這裏是類的一些引入機制和優化,這裏首先定義了一個常量LARAVEL_START , 記錄應用開始運行時間,而後引入類文件的自動載入機制,也就是/vendor/autoload.php文件,其實也就是composer自帶的類加載器。最後一步提供了一個可優化的方式,經過執行Artisan "optimize」 命令,把經常使用到的類編譯到/bootstrap/cache/compiled.php,這樣之後直接require這個類就行了,提升了加載效率,好像在thinkphp上也見過相似的優化。web

  • 再回到 /public/index.php , 在/bootstrap/app.php 實例化出一個Illuminate\Foundation\Application 對象,命名爲$app, 它做爲一個IoC容器和膠水綁定系統的各個組件。它在實例化時作了幾件事情,thinkphp

    • 執行registerBaseBindings,這個方法調用getInstant方法指向當前對象,是單一模式下的,而後放在成員變量instants數組兩個元素,這兩個key, 一個叫app,一個叫 Illuminate\Container\Container,可是值都指向這個對象。 因此叫註冊基礎綁定 ?編程

    • 而後$app繼續執行registerBaseServiceProviders方法,註冊了兩個基礎服務的provider :EventServiceProvider和RoutingServiceProvider,,注意,在實例化服務provider裏, $app對象是做爲一個參數傳入的。採用了依賴注入,而且是這是基於構造函數的實現方式。即實現特定參數的構造函數,在新建對象時傳入所依賴類型的對象。bootstrap

      • 控制反轉(Inversion of Control,縮寫爲IoC),是面向對象編程中的一種設計原則,能夠用來減低計算機代碼之間的耦合度。其中最多見的方式叫作依賴注入(Dependency Injection,簡稱DI),還有一種方式叫「依賴查找」(Dependency Lookup)。經過控制反轉,對象在被建立的時候,由一個調控系統內全部對象的外界實體,將其所依賴的對象的引用傳遞給它。也能夠說,依賴被注入到對象中。
    • 而後執行registerCoreContainerAliases,註冊了一堆別名,就是把一串長長的類名簡化了,好比說 ·Illuminate\Filesystem\FilesystemManager 被簡化成了filesystem,存入aliases成員中, 能夠一個或多個類名指向同一個別名,好比指向cache 的就有 'Illuminate\Cache\CacheManager', 'Illuminate\Contracts\Cache\Factory’。設計模式

    • 最後註冊基礎路徑 ,即把根目錄的絕對路徑賦值到basePath成員變量上,這樣實例化就完成了。數組

  • 回到/bootstrap/app.php上吧,接着$app對象又執行了三次singleton,一個是http相關,一個是console相關,一個和異常處理相關,就是向容器綁定接口,接受web和CLI的輸入請求。php框架

  • 返回到 /public/index.php中,$app 執行make方法,產生一個http kernel對象,在這個kernel對象處理http請求,接收請求,發送響應,最後終止程序和一些收尾的工做,這樣整個過程就OVER了。app

整體而言,Laravel寫得仍是很漂亮的,結構清晰,繼承體系完備,設計模式運用嫺熟,充分利用了PHP的新特性,好比命名空間,好比trait, 連數組都是用[]的表示形式。細節不少值得學習的地方,但這是一個稍微龐大的體系,特別是Illuminate,要徹底弄懂的確須要很多時間

相關文章
相關標籤/搜索