Laravel的“服務容器”和“服務提供者”,哪個是laravel 的核心?

來源:互聯網
上載者:User
關鍵字 php laravel
在一些資料中看到說,“服務容器”是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

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.