laravel的提供者、容器、門面
阿新 • • 發佈:2019-01-26
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、