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