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

猜你喜欢

转载自blog.csdn.net/jj546630576/article/details/79250235
今日推荐