Laravel 服务提供者的主要作用是什么

网上查询后发现很多文章都只是在说服务提供者怎么怎么使用的,但是基本没说服务提供者是干什么用的,有什么好处。
在应用中直接创建一个类,不用通过服务提供者进行注册,这个类就可以直接在控制器中进行注入使用了。
那么服务提供者具体作用是什么?直接创建一个类就可以在控制器注入使用为什么还要配置服务提供者这么麻烦。
那么使用服务提供者究竟有什么好处呢

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

我以前也一直不理解注入到底有啥用,new 一个类跟 app() 一个类有啥区别,,,

后来我是这样理解的:

直接放一个普通的类,就能注入了,不需要注册,,,那你要替换服务呢?还不是要修改那个注入类的类名,,,如果你很多地方都用到了这个类的注入,,,是不是要修改很多地方,,,但是,如果你类型提示是一个接口,,,然后在服务提供者里,为该接口绑定一个实现,,,以后要换的时候,就只要到服务提供者里改一下就行了。。

还有,,比如你业务逻辑 A 类的构造方法里,注入了一个 B类,来从第三方服务获取数据,,,然后你写测试的时候,不可能真的去掉第三方接口吧,你只想测试你 A 类的业务逻辑,,,这时候在测试前,可以重新给 B类 注册另一个实现,直接返回一个伪造的正确数据,,如果你想测试掉第三方失败时的业务逻辑,就绑定一个返回伪造的错误数据的实现,,

当然,如果你说我不写测试,而且可以全局搜索替换,当我上面没说

4年前 评论
largezhou (作者) 2年前
bluememory 2年前
讨论数量: 5

我以前也一直不理解注入到底有啥用,new 一个类跟 app() 一个类有啥区别,,,

后来我是这样理解的:

直接放一个普通的类,就能注入了,不需要注册,,,那你要替换服务呢?还不是要修改那个注入类的类名,,,如果你很多地方都用到了这个类的注入,,,是不是要修改很多地方,,,但是,如果你类型提示是一个接口,,,然后在服务提供者里,为该接口绑定一个实现,,,以后要换的时候,就只要到服务提供者里改一下就行了。。

还有,,比如你业务逻辑 A 类的构造方法里,注入了一个 B类,来从第三方服务获取数据,,,然后你写测试的时候,不可能真的去掉第三方接口吧,你只想测试你 A 类的业务逻辑,,,这时候在测试前,可以重新给 B类 注册另一个实现,直接返回一个伪造的正确数据,,如果你想测试掉第三方失败时的业务逻辑,就绑定一个返回伪造的错误数据的实现,,

当然,如果你说我不写测试,而且可以全局搜索替换,当我上面没说

4年前 评论
largezhou (作者) 2年前
bluememory 2年前

接1楼,service provider 和 container 密切相关, google 两者的含义:Service container is where your services are registered. Service providers provide services by adding them to the container. Laravel 官方文档上有重点提示:There is no need to bind classes into the container if they do not depend on any interfaces. The container does not need to be instructed on how to build these objects, since it can automatically resolve these objects using reflection. 综上所述,provider 是面向接口类的,可轻松实现低耦合、易拓展的程序设计.

4年前 评论
Sparkfly

个人看法:

  • 使用服务提供者注册类
  • 直接创建类(Composer 自动加载类)

两种方式都可以实现功能的扩展和实现,并且在前期开发阶段内,根本没有啥区别。。。

但是 Laravel 之所以能成为优雅框架,考虑的肯定不仅仅是眼前的问题。

两个非常高频的设计原则

  • 单一职责
  • 开闭原则

服务提供者将所有模块以服务方式提供,将类创建权交给容器,这样的设计都可以很好满足这两个原则。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!