laravel5.5框架解析[1]——設計理念

laravel5.5框架解析系列文章屬于對laravel5.5框架源碼分析,如有需要,建議按順序閱讀該系列文章, 不定期更新,歡迎關注

了解框架的一些設計理念,對于快速了解框架實現(xiàn)原理有很大幫助. 這篇文章就來談一談吧.

使用容器Container

后面的文章會詳細講解. 容器, 其實就是字面上的意思,用來盛東西的. 這里是用來盛對象的,容器里幾乎存了所有你需要全局共享的對象, 你可以隨時從容器當中取出使用. 容器能夠幫助你自動實例化一些類并保存, 你需要做的只是定義好類,在類的構造函數(shù)中聲明類所依賴的其他類(通常是一個接口), 當你需要創(chuàng)建這個類的時候, 你不必手動去創(chuàng)建, 框架會傳遞依賴, 為你new出來. 如果你的類依賴的是一個接口, 你需要事先向框架注冊, 你的接口默認用哪個實現(xiàn)類. 這樣做的好處是, 當你日后需要更換實現(xiàn)類時,只需要修改注冊的部分. 通過容器, 實現(xiàn)了很大程度上的解耦. 舉個吃飯的例子

class Person 
{
     function eat()
    {
         $tool = new Chopsticks();
         echo 'eating with ' . $tools->name;
    }
}

interface EatingTool
{
    public $name;
}

class Chopsticks implements EatingTool
{
   public $name = "中國筷子";
}

class Scoop implements EatingTool
{
   public $name = "大勺子";
}

很顯然, Person 類對 Chopsticks 類構成了依賴關系, 作為一個person, 你必須要知道筷子是如何創(chuàng)建的, 如果筷子的構造方法發(fā)生變更, 那,人必須做出變更. 如果你想換成勺子吃飯, 還得修改 eat 方法, wtf. 那么使用容器的姿勢是怎樣的呢?

// 修改Person
class Person
{
    protected $eatingTool;
    function __construct(EatingTool $tool)
    {
         $this->eatingTool = $tool;
    }
    function eat()
    {
         echo 'eating with ' . $this->eatingTool->name;
    }
}
// 綁定接口到實現(xiàn)
$container->bind(EatingTool::class, Scoop::class);
//獲取實例
$person = $container->make(Person::class);
$person->eat();

可以看到, 使用容器后,Person已經和具體的吃飯工具解耦了, 而且很重要的是, 在后面的流程中, 你也沒有創(chuàng)建吃飯工具的實例.這意味著, 你的業(yè)務邏輯也將和吃飯工具解耦.

模塊化

作為一個web框架, 路由, 認證系統(tǒng), orm , 視圖模板渲染,等基本的東西當然是必不可少的. laravel 把這些拆分為一個個的service, 通過一個叫service provider的類添加到容器當中,組成了完整的web應用. 由于容器的解耦作用, 各模塊之間沒有依賴. 如果你想要將框架中的某個模塊替換成自己實現(xiàn)方式, 你只需要修改service provider. 把你的服務模塊加入容器. laravel的模塊, 你甚至可以在其他項目中單獨使用其中某一個.模塊的獨立性給框架的構建和框架源碼閱讀帶來了很大的方便

靈活性

模塊化其實就是靈活性的體現(xiàn), 你可以方便地更改框架的核心部分. 如果你讀過框架源碼. 你會發(fā)現(xiàn)它往往把一個邏輯處理過程分得特別細,每一步都寫一個方法. 為什么這樣做? 為了方便替換邏輯實現(xiàn). 當某一個步驟(對應到某個類的某個方法)不符合你的需求時, 你可以創(chuàng)建一個繼承自這個類的新類, 然后覆蓋你想要替換的方法, 最后把你的類綁定到容器

應用類

一個基于laravel構建的項目, 在一次請求中, 首先就會創(chuàng)建一個Application實例,繼承自Container類, 包含各種基礎服務. 所以說構建一個項目,就是在完成一個Application. 一個應用的生命周期大概就是, index.php被訪問->創(chuàng)建容器->注冊服務->啟動服務-> 創(chuàng)建Request->創(chuàng)建http kernel->調用kernel的handle方法->handle方法把Request經中間件發(fā)送到控制器->控制器返回response->response發(fā)送到瀏覽器->后置處理->請求結束.

laravel/framework 目錄結構

.
└── Illuminate
    ├── Foundation // 框架核心,最基本的東西,也包含了一些trait
    ├── Support // 幫助性的類,如字符串處理,數(shù)組處理等
    ├── Contracts // 框架接口類, 這是框架所依賴的東西, 具體實現(xiàn)模塊時不依賴的
    ├── Hashing // 下面這些是獨立的服務模塊
       .
       .
       .
    └── View

其他

  • 單點入口
  • MVC, 視圖模型控制器.不是什么新鮮東西了.
  • Orm 對象關系映射, 把數(shù)據庫表映射為類, 方便操作數(shù)據庫.
  • 中間件, 在請求到達控制器之前,先經過中間件, 用來攔截請求或作其他處理
  • artisan 命令行工具, 可以為你創(chuàng)建一些需要的類等, 方便快速開發(fā)
  • 顯示路由聲明
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,697評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,351評論 25 708
  • 原文鏈接 必備品 文檔:Documentation API:API Reference 視頻:Laracasts ...
    layjoy閱讀 8,719評論 0 121
  • 《一萬小時天才理論》里面說,天才是通過激情,精深練習和伯樂指引這三個要素組成,三者缺一不可。那么今天我們就談談第一...
    missrainyday閱讀 978評論 3 12
  • 我是一個客服,在這個城市最大眾的職業(yè),沒有之一。我工資不高,沒房沒車,沒有晉升的欲望也沒有那條件。我上班路上往返需...
    俞米閱讀 470評論 6 11

友情鏈接更多精彩內容