当前位置: 首页>编程语言>正文

laravel重写容器类 laravel 容器的理解

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 ''; });
在这个举例中,定义了一个Service类,这个类有一个实例成员$app,它需要一个实现了\Illuminate\Contracts\Foundation\Application 接口的实例对象,也就是容器实例。然后通过直接使用类型名称的方式把这个类快速地绑定到了容器。app()->singleton(Service::class),等价于app()->singleton(Service::class,Service:class)。这种通过类名形式的绑定,laravel在解析的时候会调用这个类型的构造函数来实例化服务。并且在调用构造函数的时候,会通过反射获得这个构造函数的参数类型,然后从容器已有的绑定中,解析出对应参数类型的服务实例,传入构造函数完成实例化。这个过程就是所谓的依赖注入。
在以上代码中,完全没有手写的new Service(app())代码,就能正确地解析到service实例,这就是依赖注入的好处:


https://www.xamrdz.com/lan/5qz1923051.html

相关文章: