Laravel 为什么要引入服务提供者的概念?有什么好处?为什么不直接将服务注册到服务容器里呢?
我看网上的介绍依赖注入容器的文章好像没有服务提供者这个东西,都是直接将类配置到依赖注入容器里。
如果我的问题本身有什么问题请指出来。
可以想象一下 如果没有服务提供者 框架怎么知道你要注册哪些服务 比如我composer了一个第三方包 这个第三方包要怎么去把自己的服务注册到容器里面 第三方包不可能主动去注册吧 只有框架去发现服务 要怎么去发现呢 如果没有一个统一的地方 框架怎么能够去发现这个第三方包有哪些服务需要注册呢
我的理解是服务提供者是框架自带的或者你自己封装定义的核心组件,在框架启动时就注册到了容器中,这样 Laravel 容器就可以自动检测和加载服务提供者,无需手动注册,让开发过程更为便捷;且服务提供者使用了统一的方式来注册服务(所有的服务提供者都会继承
Illuminate\Support\ServiceProvider
类),相关的服务都定义在一个地方,代码更易管理和维护。当然 Laravel 也是支持你在代码中使用instance、singleton、bind
方法去直接绑定一些实例共享到容器中。 相关源码解读可以参考这个:Laravel 服务容器与服务提供者方便 composer 扩展,比如在服务提供者里面可以 注册路由与复写 框架底层的代码。我认为,在laravel 中提供者是使他优雅的核心
原因是多重的,补充楼上的,服务提供者是一个空壳,真正的服务是可替换的,如果把服务注册到容器上面,应用会耦合严重
楼上说的都很对,除了简化第三方包注册管理,目的是基于接口而非实现编程,基于稳定的接口而非实现,有助于提高代码的可维护性、可测试性和可扩展性。
服务提供者 -》 使用 function 实现实例化的生成, 不用就不需要实例化,节省cpu、内存
注册服务-》 需要 new 类,再注册,占用cpu 和内存。
比如我现在要请求一个 hello world ,
服务提供者不止干了服务绑定,看下 ServiceProvider 源码也是有点复杂呢。还有时机,ServiceProvider 的服务绑定一般是初始化时执行,好比电脑开机时执行,有点像电脑中的注册表。还有组件化开发的观念,开发一个laravel的扩展包,ServiceProvider 相当于规范也是接入laravel的接口
我的理解是 服务提供者 是程序一开始运行的时候,会运行服务提供者的代码。包含(容器的绑定、事件、路由等)。比方说如果没有服务提供者的概念。那要怎么把绑定容器、事件的代码加进去或者放在哪里。服务提供者也起到一个功能分类的作用。
虽然服务提供者是 Laravel 框架的核心处理机制,但其实开发者在编写自己代码的时候完全可以忽略它,甚至不去编写或修改服务提供者中的代码。除非你需要统一修改某个通过提供者绑定的服务或其行为。
但如果你在编写一个想在 Laravel 框架中运行的插件或包,如何跟随框架初始化或加载你的功能哪?这时候在 Laravel 框架中使用服务提供者就是哪个最佳的方案。你会看到 Laravel 插件一般会在自己的 composer.json 文件中存在如下配置:
Laravel 框架会识别并加载 "providers" 下面的这个 "Xxx\Analysis\Providers\ServiceProvider" 这个服务提供者类,并在对应的时机调用其 register() 和 boot() 方法。你将在这两个方法内随框架注册或引导自己包内的逻辑。