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

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

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

使用容器Container

后面的文章會詳細(xì)講解. 容器, 其實(shí)就是字面上的意思,用來盛東西的. 這里是用來盛對象的,容器里幾乎存了所有你需要全局共享的對象, 你可以隨時(shí)從容器當(dāng)中取出使用. 容器能夠幫助你自動實(shí)例化一些類并保存, 你需要做的只是定義好類,在類的構(gòu)造函數(shù)中聲明類所依賴的其他類(通常是一個接口), 當(dāng)你需要創(chuàng)建這個類的時(shí)候, 你不必手動去創(chuàng)建, 框架會傳遞依賴, 為你new出來. 如果你的類依賴的是一個接口, 你需要事先向框架注冊, 你的接口默認(rèn)用哪個實(shí)現(xiàn)類. 這樣做的好處是, 當(dāng)你日后需要更換實(shí)現(xiàn)類時(shí),只需要修改注冊的部分. 通過容器, 實(shí)現(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;
    }
}
// 綁定接口到實(shí)現(xiàn)
$container->bind(EatingTool::class, Scoop::class);
//獲取實(shí)例
$person = $container->make(Person::class);
$person->eat();

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

模塊化

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

靈活性

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

應(yīng)用類

一個基于laravel構(gòu)建的項(xiàng)目, 在一次請求中, 首先就會創(chuàng)建一個Application實(shí)例,繼承自Container類, 包含各種基礎(chǔ)服務(wù). 所以說構(gòu)建一個項(xiàng)目,就是在完成一個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 // 框架接口類, 這是框架所依賴的東西, 具體實(shí)現(xiàn)模塊時(shí)不依賴的
    ├── Hashing // 下面這些是獨(dú)立的服務(wù)模塊
       .
       .
       .
    └── View

其他

  • 單點(diǎn)入口
  • MVC, 視圖模型控制器.不是什么新鮮東西了.
  • Orm 對象關(guān)系映射, 把數(shù)據(jù)庫表映射為類, 方便操作數(shù)據(jù)庫.
  • 中間件, 在請求到達(dá)控制器之前,先經(jīng)過中間件, 用來攔截請求或作其他處理
  • artisan 命令行工具, 可以為你創(chuàng)建一些需要的類等, 方便快速開發(fā)
  • 顯示路由聲明
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末巩那,一起剝皮案震驚了整個濱河市砖织,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌皮官,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欺殿,死亡現(xiàn)場離奇詭異坯认,居然都是意外死亡卷中,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門敬辣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雪标,“玉大人,你說我怎么就攤上這事购岗√” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵喊积,是天一觀的道長烹困。 經(jīng)常有香客問我,道長乾吻,這世上最難降的妖魔是什么髓梅? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮绎签,結(jié)果婚禮上枯饿,老公的妹妹穿的比我還像新娘。我一直安慰自己诡必,他們只是感情好奢方,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著爸舒,像睡著了一般蟋字。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扭勉,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天鹊奖,我揣著相機(jī)與錄音,去河邊找鬼涂炎。 笑死忠聚,一個胖子當(dāng)著我的面吹牛设哗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播两蟀,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼网梢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了垫竞?” 一聲冷哼從身側(cè)響起澎粟,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎欢瞪,沒想到半個月后活烙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡遣鼓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年啸盏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骑祟。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡回懦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出次企,到底是詐尸還是另有隱情怯晕,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布缸棵,位于F島的核電站舟茶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏堵第。R本人自食惡果不足惜吧凉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望踏志。 院中可真熱鬧阀捅,春花似錦、人聲如沸针余。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽圆雁。三九已至傍妒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間摸柄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工既忆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留驱负,地道東北人嗦玖。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像跃脊,于是被迫代替她去往敵國和親宇挫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容

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