laravel5.5框架解析[1]——設(shè)計理念

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

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

使用容器Container

后面的文章會詳細(xì)講解. 容器, 其實就是字面上的意思,用來盛東西的. 這里是用來盛對象的,容器里幾乎存了所有你需要全局共享的對象, 你可以隨時從容器當(dāng)中取出使用. 容器能夠幫助你自動實例化一些類并保存, 你需要做的只是定義好類,在類的構(gòu)造函數(shù)中聲明類所依賴的其他類(通常是一個接口), 當(dāng)你需要創(chuàng)建這個類的時候, 你不必手動去創(chuàng)建, 框架會傳遞依賴, 為你new出來. 如果你的類依賴的是一個接口, 你需要事先向框架注冊, 你的接口默認(rèn)用哪個實現(xiàn)類. 這樣做的好處是, 當(dāng)你日后需要更換實現(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 類構(gòu)成了依賴關(guān)系, 作為一個person, 你必須要知道筷子是如何創(chuàng)建的, 如果筷子的構(gòu)造方法發(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已經(jīng)和具體的吃飯工具解耦了, 而且很重要的是, 在后面的流程中, 你也沒有創(chuàng)建吃飯工具的實例.這意味著, 你的業(yè)務(wù)邏輯也將和吃飯工具解耦.

模塊化

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

靈活性

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

應(yīng)用類

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

laravel/framework 目錄結(jié)構(gòu)

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

其他

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

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容