laravel中的Contracts, ServiceContainer, ServiceProvider, Facades關(guān)系詳解

contracts, servicecontainer, serviceprovider, facades?

1.Contracts 合同,契約,也就是接口,定義一些規(guī)則,每個(gè)實(shí)現(xiàn)此接口的都要實(shí)現(xiàn)里面的方法;

2.ServiceContainer,實(shí)現(xiàn)Contracts,具體的邏輯實(shí)現(xiàn);

3.ServiceProvider, serviceContainer的服務(wù)提供者,返回ServiceContainer的實(shí)例化,供其他地方使用,可以把它加入到app/config的provider中,會(huì)被自動(dòng)注冊(cè)到容器中;

4.Facades, 簡(jiǎn)化ServiceProvider的調(diào)用方式,而且可以靜態(tài)調(diào)用ServiceContainer中的方法;

?

實(shí)現(xiàn)

Contracts接口可以寫或不寫,這里就不定義了;

定義一個(gè)ServiceContainer,實(shí)現(xiàn)具體的功能? ? ?

namespace?AppHelper; class?MyFoo { ????public?function?add($a,?$b) ????{ ????????return?$a+$b; ????} }

?

?

定義一個(gè)ServiceProvider供其他地方使用ServiceContain

<?php namespace AppProviders; use AppHelperMyFoo; //要服務(wù)的Container use IlluminateSupportServiceProvider; use App; class MyFooServiceProvider extends ServiceProvider {     public function boot(){}     //注冊(cè)到容器中     public function register()     {         //可以這么綁定,這需要use App;         App::bind("myfoo",function(){             return new MyFoo();         });         //也可以這么綁定         $this->app-&gt;bind("myfoo",?function(){ ????????????return?new?MyFoo(); ????????}); ????} }

?

?

在app/config.php中的providers數(shù)組中加入ServiceProvider,讓系統(tǒng)自動(dòng)注冊(cè)

AppProvidersMyFooServiceProvider::class,

?

這時(shí)候就可以使用了,假設(shè)在控制器中使用

public?function?two($id=null) { ????//從系統(tǒng)容器中獲取實(shí)例化對(duì)象 ????$myfoo?=?App::make("myfoo"); ????echo?$myfoo-&gt;add(1,2); }

?

這樣太麻煩,還需要用make來獲取對(duì)象,為了簡(jiǎn)便,就可以使用門面功能,定義門面MyFooFacade

namespace?AppFacades; use?IlluminateSupportFacadesFacade; class?MyFooFacade?extends?Facade { ????protected?static?function?getFacadeAccessor() ????{ ????????//這里返回的是ServiceProvider中注冊(cè)時(shí),定義的字符串 ????????return?'myfoo'; ????} }

?

在控制器里就可以直接調(diào)用了

use?AppFacadesMyFooFacade; public?function?two($id=null) { ????//從系統(tǒng)容器中獲取實(shí)例化對(duì)象 ????$myfoo?=?App::make("myfoo"); ????echo?$myfoo-&gt;add(1,2); ????//使用門面 ????echo?MyFooFacade::add(4,5); }

?

?

總的來說,自定義了一個(gè)類,為了方便在其他別處使用,便可以使用服務(wù)提供者和門面。

推薦:《laravel教程

以上就是

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊6 分享