1.laravel容器的基本认识
在bootstrap/app.php内进行实例化,$app为容器管理工具,负责所有的服务组件的实例化以及实例化生命周期的管理。
优点:很好对代码进行解耦,写业务代码时,不用担心服务组件的对象从何而来,不用自己去各种引用,只要用 $app解析出所需要的实例就行了
$app = new Illuminate\Foundation\Application( realpath(__DIR__.'/../') );
app.php里面的初始化代码,初始化所有的组件和依赖
2.代码中获取容器实例
a.获取代码
$app=app();
Route::get('/', function () { dd(App::basePath()); return ''; });
b.在config.php的aliases依赖中注册了App这个别名,使用时不用use就可以使用App::来调用Facades里面的方法
'App' => Illuminate\Support\Facades\App::class,
c.另外一种方式拿到laravel容器实例就是在服务提供者里面直接使用$this->app
abstract class ServiceProvider { protected $app; }
laravel 在提供服务提供者的时候,会把容器实例都注入倒$app上面,在服务提供者里,可以用
$this->app访问到容器实例
3.服务绑定和解析
a.singleton,bind方法以及数组形式都是laravel的服务绑定方法
singleton形式
app()->singleton('service', 'this is service1');
bind形式
app()->bind('service', function(){ return new Service(); },true);
数组形式
app()['service'] = function(){ return new Service(); };
b.服务解析
在laravel里面通过make方法来完成服务的解析
$service= app()->make('service');
其他解析方式
app()['service'];
app('service');
4.服务器绑定别名
通过服务绑定的别名,在解析服务的时候,跟不使用别的效果一致。别名的作用也是为了同时支持全类型的服务绑定名称以及简短的服务绑定名称考虑的
1)如何指定和使用服务绑定名称的别名
假如有一个服务做如下绑定:
app()->singleton('service1', function(){ new CasServerManager(); });
那么可以通过容器方法alias方法指定别名:
app()->alias('service1', 'alias_a');
这个方法的第一个参数是服务绑定名称,第二个参数是别名。这个方法调用后,就会在容器实例属性aliases数组里面存入一条记录
5.依赖注入
class Service{
protected $app;
public function __construct(\Illuminate\Contracts\Foundation\Application $app)
{
$this->app = $app;
}
}
app()->singleton(Service::class);
Route::get('/', function () { dd(app(Service::class)); return ''; });