当前位置: 首页 > 后端技术 > PHP

认识Laravel中的服务提供者和服务容器

时间:2023-03-29 23:09:07 PHP

其实laravel中的服务容器是一个依赖容器,什么是依赖容器,请看下文。依赖注入当一个系统变得复杂时,经常会遇到A类需要B类的方法,B类需要C类的方法。按照传统的思维方式,我们会这样写:classBim{publicfunctiondoSomething(){echo__METHOD__,'|';}}bar类{publicfunctiondoSomething(){$bim=newBim();$bim->doSomething();echo__METHOD__,'|';}}classFoo{publicfunctiondoSomething(){$bar=newBar();$bar->doSomething();回声__METHOD__;}}$foo=newFoo();$foo->doSomething();应用依赖注入的思想(依赖注入听起来很花哨,但其本质是通过构造函数或在某些情况下通过set方法将类依赖注入到类中):改为:classBim{publicfunctiondoSomething(){echo__METHOD__,'|';}}类酒吧{私人$bim;公共函数__construct(Bim$bim){$this->bim=$bim;}publicfunctiondoSomething(){$this->bim->doSomething();echo__METHOD__,'|';}}classFoo{private$bar;公共函数__construct(Bar$bar){$this->bar=$bar;}publicfunctiondoSomething(){$this->bar->doSomething();回声__METHOD__;}}$foo=newFoo(newBar(newBim()));$foo->doSomething();//Bim::doSomething|Bar::doSomething|Foo::doSomething依赖于容器类的实例化还是手动new。依赖容器的作用是管理类的实例化。应用程序需要获取Foo类,然后从容器中获取Foo类。容器创建Bim类,然后创建Bar类,放Bim类。注入,创建Foo类,注入Bar,应用程序调用Foo方法,Foo调用Bar方法,然后做其他工作上面的应用程序依赖容器后(这段代码来自推特):classContainer{private$s=数组();函数__set($k,$c){$this->s[$k]=$c;}函数__get($k){返回$this->s[$k]($this);}}$c=newContainer();$c->bim=function(){returnnewBim();};$c->bar=function($c){returnnewBar($c->bim)};};$c->foo=function($c){returnnewFoo($c->bar);};//从容器中获取Foo$foo=$c->foo;$foo->doSomething();//Bim::doSomething|Bar::doSomething|Foo::doSomethinglaravel中的服务提供者参见官方示例:注册服务:useRiak\Connection;useIlluminate\Support\ServiceProvider;classTestServiceProviderextendsServiceProvider{/***在容器中注册绑定。**@returnvoid*/publicfunctionregister(){//使用单例绑定单例$this->app->singleton('test',function(){returnnewTestService();});}}有没有发现register方法其实是在依赖容器中设置了一个类。然后官方文档也说$this->app是服务容器,看名字也知道其实是依赖容器。