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ā)
- 顯示路由聲明