Laravel 之 Application---理論篇

dongyuhappy發表於2017-03-09

核心概念

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 協議》,轉載必須註明作者和本文連結

相關文章