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);