Contracts 合同,契約,也就是接口,定義一些規則,每一個實現此接口的都要實現裏面的方法php
ServiceContainer 實現Contracts,具體的邏輯實現laravel
ServiceProvider ServiceContainer的服務提供者,返回ServiceContainer的實例化,供其餘地方使用,能夠把它加入到app/config的provider中,會被自動註冊到容器中segmentfault
Facades 簡化ServiceProvider的調用方式,並且能夠靜態調用ServiceContainer中的方法數組
Contracts接口能夠寫或不寫,這裏就不定義了定義一個ServiceContainer,實現具體的功能app
namespace App\Helper; class MyFoo{ public function add($a, $b) { return $a+$b; } }
定義一個ServiceProvider供其餘地方使用ServiceContain框架
<?phpnamespace App\Providers; use App\Helper\MyFoo; //要服務的Containeruse Illuminate\Support\ServiceProvider; use App; class MyFooServiceProvider extends ServiceProvider{ public function boot(){} //註冊到容器中 public function register() { //能夠這麼綁定,這須要use App; App::bind("myfoo",function(){ return new MyFoo(); }); //也能夠這麼綁定 $this->app->bind("myfoo", function(){ return new MyFoo(); }); } }
在app/config.php中的providers數組中加入ServiceProvider,讓系統自動註冊ide
App\Providers\MyFooServiceProvider::class,
這時候就能夠使用了,假設在控制器中使用this
public function two($id=null){ //從系統容器中獲取實例化對象 //app('myfoo')->add(1,2); $myfoo = App::make("myfoo"); echo $myfoo->add(1,2); }
這樣太麻煩,還須要用make來獲取對象,爲了簡便,就能夠使用門面功能,定義門面MyFooFacadespa
namespace App\Facades; use Illuminate\Support\Facades\Facade; class MyFooFacade extends Facade{ protected static function getFacadeAccessor() { //這裏返回的是ServiceProvider中註冊時,定義的字符串 return 'myfoo'; } }
在控制器裏就能夠直接調用了code
use App\Facades\MyFooFacade; public function two($id=null){ //從系統容器中獲取實例化對象 $myfoo = App::make("myfoo"); echo $myfoo->add(1,2); //使用門面 echo MyFooFacade::add(4,5); }
總的來講,自定義了一個類,爲了方便在其餘別處使用,即可以使用服務提供者和門面
----------------------------華麗的分割線----------------------------
簡單的說,「服務容器」就是「服務提供者」提供的服務的容器,「服務容器」經過「服務提供者」來獲取服務。
一個laravel應用就是一個「服務容器」,整個框架提供的各類功能由「服務提供者」提供並注入到「服務容器」中。每個「服務提供者」裏register的方法裏面使用bind邦定某個對象到一個變量,那個對象就是真正提供服務的對象。