核心概念
laravel中的Application
首先是一個容器物件,其次也是一個應用程式物件。
容器物件
作為容器物件,它提供了以下功能
- 註冊建立物件的規則,並在需要的時候建立它;
- 提供了類似全域性變數儲存資料的能力。
只需要往容器裡面註冊一下建立物件的規則,對於使用者而言,只需要使用的時候直接找容器索取,這樣做帶來的好處有:
- 物件集中管理,如果把物件比喻成怪獸,那麼容器物件就是裝怪獸的籠子,怪獸被裝進了一個由你控制的籠子裡面了,你想幹什麼都容器。
- 降低耦合,建立規則和使用的分離,對於使用者而言,完全不必關注如何建立,只管使用就好了。
注意:容器物件在建立類的時候,如果被建立的類的建構函式定義的引數是基本型別的值(string,int....)的話,必須手動傳入這個引數,
如果是建構函式的引數是物件型別值的話,容器物件會自動建立注入。
例子
class Car{
protected $name;
public function __construct( $name)
{
$this->name = $name;
}
function __toString()
{
return (string)$this->name;
}
}
$app = new \Illuminate\Foundation\Application();
// 錯誤的返回,因為Car的建構函式需要一個基本的資料型別的值,容易物件無法自動構建
// $app->bind('car',Car::class);
//正確的方式,手動在定義建立規則的時候傳入引數
$app->bind('car',function(){
return new Car('雷克薩斯');
});
echo $app->make('car');
應用程式物件
Application
作為了一個應用程式物件,主要提供了一下功能:
- 註冊基礎核心服務,
EventServiceProvider
(events),LogServiceProvider
(log),RoutingServiceProvider
(路由相關服務) - 提供了執行bootstrappers列表的API介面
bootstrapWith
- 提供了執行serviceProvider列表的API介面
boot
- 提供了獲取設定應用程式內部資訊的功能。
總結
以容器為核心的思考方式要遵循以下3點
- 在整個應用程式執行的過程中有且只有一個容器物件
- 向容器裡面註冊構造物件的規則
- 從容器物件獲取物件
深入理解其機理最好的方式就是閱讀interface Application
這個介面的程式碼。
程式碼表示如下
class Car{
protected $name;
public function __construct(\Illuminate\Foundation\Application $app, $name)
{
$this->name = $name;
// $app
}
function __toString()
{
return (string)$this->name;
}
}
$app = new \Illuminate\Foundation\Application();
// 註冊構建物件的規則
$app->bind('car',function()use($app){
return new Car($app,'雷克薩斯');
});
// 使用
echo $app->make('car');
本作品採用《CC 協議》,轉載必須註明作者和本文連結