1. 程式人生 > >laravel的提供者、容器、門面

laravel的提供者、容器、門面

1、laravel Container:
Class Bar{
}
Class Foo{
    public function __construct(Bar $bar) {
    }
}
App::bind('Foo(類全名)',function(){
    return new Foo(new Bar());
});
Route::get('getclass',function(Foo  $foo){
        dd($foo);
});

laravel會先檢測,APP(應用主題)是否有繫結Foo類,如果有繫結就會直接
去呼叫接受返回的物件,如果沒有繫結laravel就會自己去找到Foo對應的
類然後去new
Foo,當發現Foo依賴Bar時候再去呼叫new Bar(這都是 根據php新特性反射機制找到的) 2、ServiceProvider: 2.1 :將類與ServiceProvider繫結 2.2:通過呼叫ServiceProvider返回類物件,呼叫物件方法: app('test')->get() app()['test']->get() app('Test')->make('get') 這樣會高度解耦 eg: 1)新建一個類: namespace App\Third; class Wechart
{
public function get(){ return 'success'; } } 2)命令列建立一個ServiceProvider: php artisan make:provider WechartServiceProvider 3)WechartServiceProvider的register: public function register() { $this->app->bind('wechart',function
(){ return new Wechart(); }); } 4)現在雖然將wechart類與WechartServiceProvider建立了關聯 關係,但是laravel不知道有WechartServiceProvider這個類, 所以要在config/app.php的provider中,新增 WechartServiceProvider告訴laravel,這樣laravel在初始化 時候載入進來,全域性才可以使用 5)使用,通過WechartServiceProvider返回Wechart類物件: 5.1)app('wechart')->get(); //success 5.2)當然可以通過php反射使用(不推薦): Route::get('getclass',function(\App\Third\Wechart $wechart){ dd($wechart->getSuccess()); }); 3、Facades門面: 分析Route:' Route' => Illuminate\Support\Facades\Route::class, 所有的門面(Route)都是繼承Facades,Facades有個__callStatic, 當呼叫靜態(Route::get())的方法不存在,會呼叫當前的Facades中 __callStatic,然後改方法會呼叫Route中的getFacadeAccessor, 這個方法每個門面類中都會有,然後會執行: $instance = static::getFacadeRoot(),而getFacadeRoot方法 會返回: static::resolveFacadeInstance(static::getFacadeAccessor()); //相當於app('xxx'),其中xxx就是getFacadeAccessor字串 這樣就得到了Route對應的真正的類的例項,然後接著執行__callStatic 中$instance->$method(...$args),就呼叫到對應的方法。 所以呼叫門面中的方法一般都是: 方法: 1) alias的key::方法名稱 //Route::get() 2)app('xx')->get() //其中xx就是getFacadeAccessor中的返回 屬性: 1)alias的key::get('database.default') 2)app('xx')['database.default']['default'] 4、Contracts定義的基本都是各個服務的介面: 介面都放在: vendor/laravel/framework/src/Illuminate/Contracts 類的實現都在: vendor/laravel/framework/src/Illuminate下 其實Contracts應該就是就是laravel提供給開發者的laravel內部使用類的介面,比如提供的所有Mail都無法滿足需求,我們就可以實現 Illuminate/Contracts/Mail介面,然後開發我們的類,然後把在 config/app.php中的aliases中的Email換成自己寫的就可以了 5