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

Laravel服务容器必知

时间:2023-03-29 22:31:03 PHP

文章转发自专业的Laravel开发者社区,原文链接:https://learnku.com/laravel/t...学习如何用Laravel构建应用不仅仅是学习使用框架中的不同类和组件,也不记得所有工匠命令或所有辅助函数(我们有谷歌)。学习使用Laravel编码就是学习它的哲学和优雅迷人的语法。我个人认为这是一门艺术和手艺(巧合的是,Laravel工程师有时也被称为网络艺术家)。其他框架也是如此。服务容器和IOC容器是Laravel理念的重要组成部分。作为一名Laravel开发者,正确理解和使用服务容器是你掌握它的重要部分,因为它是任何Laravel应用程序的核心。基础知识尽管IOC容器本质上只是一个普通的PHP类,但我喜欢将其视为“囊中之物”。这个“包”是我们放置或“绑定”我们需要在Laravel应用程序中运行的任何对象服务的地方,从接口实现到目录路径等等。所谓的“包中的把戏”现在我们有一个包含所有绑定对象服务的单个对象(IOC容器),因此在我们的代码中任何时候都可以很容易地从这个单个对象中获取或“解析”这些对象的方式处理服务绑定现在假设我们有一个特殊的函数FooService类。app->bind('FooService',\App\Services\FooService::class);在Laravel中我们常说:“将FooService服务巧妙地注入到了包中”。当然,根据使用场景和服务方式,还有其他的绑定服务的方式,只要了解它的基本思想即可。有关绑定的完整参考,请参阅Laravel的文档。服务容器需要知道服务必须绑定到服务提供者的注册方法。如何解决?当服务绑定到容器后,我们可以在应用程序的任何地方获取或解析服务。//使用IoC我们可以做到这一点$fooService=app()->make('FooService');$fooService->doSomething();//也可以减少到一行代码app()->make('FooService')->doSomething();我们只需要告诉Laravel:“记住FooService,在我需要的时候给我。”你注意到了吗?使用IoC创建服务可以使代码更加简洁、清晰、易读。这就是Laravel的美妙之处,它会让你的代码更容易测试,因为当你测试时你可以使用一个假类来替换FooService(我想你应该熟悉如何在测试中假类)。在容器中绑定接口在面向对象的编程中,接口是一种创建必须遵守某些方案或约束的类的方法。这有助于其他开发人员创建与您的界面中设置的约束相匹配的代码。这迫使它们将合法参数传递给函数并返回特定数据类型,尽管它们的方法实现可能不同。这样,您可以轻松地确保继承相同接口的不同实现将以相同的方式工作。在Laravel的容器中,我们可以绑定一个特定接口的实现,这样当我们解析这个接口时,我们最终会得到绑定到它的具体类。$this->app->bind(FooInterface::class,FooClass::class);所以当FooInterface解析成功后,Laravel很聪明地给了我们一个FooClass的实例。现在假设我们已经编写了一个名为BarClass的FooInterface的更好实现,我们想用它替换FooClass,我们需要做的就是:$this->app->bind(FooInterface::class,BarClass::class);我们的代码仍然有效,因为我们知道BarClass将遵循我们的界面,并且即使BarClass的行为不符合预期,我们也可以切换回FooClass。这是在没有太多回归的情况下升级应用程序代码的好方法。依赖解析我们知道Laravel可以解析我们在容器中绑定的服务和接口,但它能做的远不止于此。事实上,它可以自动为我们解决这些服务的依赖关系,而无需我们编写一行代码。假设我们的项目中有以下服务类。bar=$bar;}/***做一些有用的事情**@returnstring*/publicfunctiondoSomething(){return$this->bar->somethingToDo();我们可以看到FooService需要一个BarService的实例。我们如何将它绑定到容器中,以便当Laravel为我们提供FooService的实例时,它也为我们提供BarService的实例?您可能认为解决方案是这样的:$this->app->bind('Foo',newFooService(newBarService));从技术上讲,这是可能的,但实际上我们不需要这样做。Laravel利用PHP强大的反射特性自动为我们解决了这个问题。所以,你只需像往常一样绑定:$this->app->bind('Foo',FooService::class);现在,当代码解析为Foo时,Laravel将寻找FooService服务,当发现它需要BarService服务的实例时;Laravel会再次寻找BarService服务,并将实例化的对象提供给FooService服务的构造函数,从而为我们创建一个完整的实例。这些过程不需要我们写一行代码,真是了不起,思路清晰!!除此之外,将为所有依赖项提供上述过程。所以,如果BarService服务也有自己的依赖,也会通过上面的方法解决。最后的话关于Laravel的服务容器,还有很多很酷的东西需要讨论和学习。希望这个小小的介绍能给大家一些启发,帮助大家加深对容器的理解。我鼓励您通过阅读文档[docs](https://laravel.com/docs/5.6/...)了解更多信息。谢谢阅读。