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->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->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->add(1,2); ????//使用門面 ????echo?MyFooFacade::add(4,5); }
?
?
總的來說,自定義了一個(gè)類,為了方便在其他別處使用,便可以使用服務(wù)提供者和門面。
推薦:《laravel教程》