Contracts
, ServiceContainer
, ServiceProvider
, Facades
1.Contracts
合約,契約,也就是接口,定義一些規則,每個實作此介面的都要實作裡面的方法;
2.ServiceContainer
,實作Contracts
,具體的邏輯實作;
3.ServiceProvider
, serviceContainer
的服務提供者,傳回ServiceContainer
的實例化,供其他地方使用,可以把它加入 app/config
的provider
中,會被自動註冊到容器中;
4.Facades
, 簡化ServiceProvider
的呼叫方式,而且可以靜態呼叫ServiceContainer
中的方法;
##實作
Contracts介面可以寫或不寫,這裡就不定義了;
ServiceContainer,實作特定的功能
namespace App\Helper; class MyFoo { public function add($a, $b) { return $a+$b; } }# 定義一個
ServiceProvider供其他地方使用
ServiceContain
<?php namespace App\Providers; use App\Helper\MyFoo; //要服务的Container use 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,讓系統自動註冊
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教學》
以上是laravel中的Contracts, ServiceContainer, ServiceProvider, Facades關係詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!