1.创建服务提供者命令

php artisan make:provider 名称

2.绑定服务

//单例绑定
$this->app->singleton('b', function () {
     return new \App\Http\Services\Bservice;
});

//普通绑定
$this->app->bind('b', function () {
     return new \App\Http\Services\Bservice;
});

服务提供者里是可以通过$this->app调用全局容器对象的.其他地方有如下几种调用方法:

1.app()

2.\App

3.$app = require_once __DIR__.'/../bootstrap/app.php';

解析注册服务方法:

var_dump(\App::make('b'));

var_dump(resolve('b'));

var_dump(app('b'));

 上下文绑定:

$this->app->when('App\Http\Controllers\TestController')
            ->needs(BaseService::class)
            ->give('App\Http\Services\Bservice');

        $this->app->when('App\Http\Controllers\FooController')
            ->needs(BaseService::class)
            ->give('App\Http\Services\Cservice');

此绑定只支持依赖注入  也就是在这两个controller的构造函数注入类型为BaseService的类时  返回的是两个不同的服务。

 

注:这里为什么构造函数可以实现自动注入,因为在运行过程中 先反射这个控制器 是否有参数为对象类型约束  是的话  就要去实例化这个类,并传入构造函数的参数中。

 

标签绑定:

$this->app->tag(['Bservice','Cservice'],'ext');

 $this->app->bind('Aservice',function () {
             return new \App\Http\Services\Aservice($this->app->tagged('ext'));
});

这里tagged获取的是上面标记的服务数组.

 

三种获取注册服务的方法:

1. app($serverName);

2.\App::make($serverName);

3.resolve($serverName);

 

posted on 2018-07-23 18:01  沉默的土豆  阅读(119)  评论(0编辑  收藏  举报