在一些資料中看到說,“服務容器”是laravel 的核心,“服務提供者”也是laravel 的核心。
問題:
1、究竟哪個是核心,還是它們兩個組合起來構成了核心?
2、它們兩個的關係是什嗎?
3、它們兩個各自的作用是什麼的?
4、有“服務容器”,有“服務提供者”,那具體的“服務”在什麼地方?打個比方,就是有裝飯的鍋,有裝飯的碗,那飯在什麼地方?是在鍋裡,還是在碗裡,還是在田裡?
回複內容:
在一些資料中看到說,“服務容器”是laravel 的核心,“服務提供者”也是laravel 的核心。
問題:
1、究竟哪個是核心,還是它們兩個組合起來構成了核心?
2、它們兩個的關係是什嗎?
3、它們兩個各自的作用是什麼的?
4、有“服務容器”,有“服務提供者”,那具體的“服務”在什麼地方?打個比方,就是有裝飯的鍋,有裝飯的碗,那飯在什麼地方?是在鍋裡,還是在碗裡,還是在田裡?
可以去看我的這篇筆記
https://segmentfault.com/a/1190000004965752
摘選
Contracts, ServiceContainer, ServiceProvider, Facades關係
Contracts 合約,契約,也就是介面,定義一些規則,每個實現此介面的都要實現裡面的方法
ServiceContainer 實現Contracts,具體的邏輯實現
ServiceProvider ServiceContainer的服務提供者,返回ServiceContainer的執行個體化,供其他地方使用,可以把它加入到app/config的provider中,會被自動註冊到容器中
Facades 簡化ServiceProvider的調用方式,而且可以靜態調用ServiceContainer中的方法
實現
Contracts介面可以寫或不寫,這裡就不定義了
定義一個ServiceContainer,實現具體的功能
namespace App\Helper;class MyFoo{ public function add($a, $b) { return $a+$b; }}
定義一個ServiceProvider供其他地方使用ServiceContain
app->bind("myfoo", function(){ return new MyFoo(); }); }}
在app/config.php中的providers數組中加入ServiceProvider,讓系統自動註冊
App\Providers\MyFooServiceProvider::class,
這時候就可以使用了,假設在控制器中使用
public function two($id=null){ //從系統容器中擷取執行個體化對象 $myfoo = App::make("myfoo"); echo $myfoo->add(1,2);}
這樣太麻煩,還需要用make來擷取對象,為了簡便,就可以使用門面功能,定義門面MyFooFacade
namespace App\Facades;use Illuminate\Support\Facades\Facade;class MyFooFacade extends Facade{ protected static function getFacadeAccessor() { //這裡返回的是ServiceProvider中註冊時,定義的字串 return 'myfoo'; }}
在控制器裡就可以直接調用了
use App\Facades\MyFooFacade;public function two($id=null){ //從系統容器中擷取執行個體化對象 $myfoo = App::make("myfoo"); echo $myfoo->add(1,2); //使用門面 echo MyFooFacade::add(4,5);}
總的來說,自訂了一個類,為了方便在其他別處使用,便可以使用服務提供者和門面
Laravel中Container就好似一個大水桶,是核心,每一個Service就好似裝滿一種飲料的瓶瓶罐罐,Service Provider就好似串連飲料瓶和水桶的插管,可要可不要,直接往水桶裡倒也行,雖然這樣不講究。。想去大水桶喝飲料去(一次請求來了),Facade就好似是水瓢幫你從水桶裡舀水,當然不要也行直接用手,雖然不衛生,所以Facade可要可不要。
奧,對了,還有一個Contract,主要是為了好管理每一個Service,在碳酸水Service裡,那也有分類,可樂百事被一個Contract拴在一起,雪碧美年達被另一個Contract拴在一起,主要也是為了好測試好替換而已。。
總之,Laravel這幾個主要概念也就幹了這些事,沒啥高深的。
如有不全面的請留言。
關於這個推薦一篇博文
laravel 學習筆記 —— 神奇的服務容器
簡單的說,“服務容器”就是“服務提供者”提供的服務的容器,“服務容器”通過“服務提供者”來擷取服務。
一個laravel應用就是一個“服務容器”,整個架構提供的各種功能由“服務提供者”提供並注入到“服務容器”中。每一個“服務提供者”裡register
的方法裡面使用bind
邦定某個對象到一個變數,那個對象就是真正提供服務的對象。
服務容器和服務提供者的核心是降低查詢資料庫的rps參數
from https://segmentfault.com/q/1010000000602732