Laravel 为什么要引入服务提供者的概念?有什么好处?为什么不直接将服务注册到服务容器里呢?

我看网上的介绍依赖注入容器的文章好像没有服务提供者这个东西,都是直接将类配置到依赖注入容器里。
如果我的问题本身有什么问题请指出来。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 11

可以想象一下 如果没有服务提供者 框架怎么知道你要注册哪些服务 比如我composer了一个第三方包 这个第三方包要怎么去把自己的服务注册到容器里面 第三方包不可能主动去注册吧 只有框架去发现服务 要怎么去发现呢 如果没有一个统一的地方 框架怎么能够去发现这个第三方包有哪些服务需要注册呢

1年前 评论

我的理解是服务提供者是框架自带的或者你自己封装定义的核心组件,在框架启动时就注册到了容器中,这样 Laravel 容器就可以自动检测和加载服务提供者,无需手动注册,让开发过程更为便捷;且服务提供者使用了统一的方式来注册服务(所有的服务提供者都会继承 Illuminate\Support\ServiceProvider 类),相关的服务都定义在一个地方,代码更易管理和维护。当然 Laravel 也是支持你在代码中使用 instance、singleton、bind 方法去直接绑定一些实例共享到容器中。 相关源码解读可以参考这个:Laravel 服务容器与服务提供者

1年前 评论

方便 composer 扩展,比如在服务提供者里面可以 注册路由与复写 框架底层的代码。我认为,在laravel 中提供者是使他优雅的核心

1年前 评论

原因是多重的,补充楼上的,服务提供者是一个空壳,真正的服务是可替换的,如果把服务注册到容器上面,应用会耦合严重

1年前 评论
九霄道长

楼上说的都很对,除了简化第三方包注册管理,目的是基于接口而非实现编程,基于稳定的接口而非实现,有助于提高代码的可维护性、可测试性和可扩展性。

1年前 评论
aab 1年前
yyy123456 1年前

服务提供者 -》 使用 function 实现实例化的生成, 不用就不需要实例化,节省cpu、内存
注册服务-》 需要 new 类,再注册,占用cpu 和内存。

比如我现在要请求一个 hello world ,

  1. 服务提供者: 只需要加载最少的文件,new 最少的类就行(虽然文件超级多)
  2. 注册服务: 几乎需要加载全部文件,全部实例化, 如果需要实例的软件包有三方接口呢?是否可能会产生 http 请求?
1年前 评论

服务提供者不止干了服务绑定,看下 ServiceProvider 源码也是有点复杂呢。还有时机,ServiceProvider 的服务绑定一般是初始化时执行,好比电脑开机时执行,有点像电脑中的注册表。还有组件化开发的观念,开发一个laravel的扩展包,ServiceProvider 相当于规范也是接入laravel的接口

1年前 评论

我的理解是 服务提供者 是程序一开始运行的时候,会运行服务提供者的代码。包含(容器的绑定、事件、路由等)。比方说如果没有服务提供者的概念。那要怎么把绑定容器、事件的代码加进去或者放在哪里。服务提供者也起到一个功能分类的作用。

1年前 评论
sanders

虽然服务提供者是 Laravel 框架的核心处理机制,但其实开发者在编写自己代码的时候完全可以忽略它,甚至不去编写或修改服务提供者中的代码。除非你需要统一修改某个通过提供者绑定的服务或其行为。

但如果你在编写一个想在 Laravel 框架中运行的插件或包,如何跟随框架初始化或加载你的功能哪?这时候在 Laravel 框架中使用服务提供者就是哪个最佳的方案。你会看到 Laravel 插件一般会在自己的 composer.json 文件中存在如下配置:

{
    "name": "xxx/module-analysis",
    "description": "分析模块",
    "type": "library",
    "require": {
        "php": "^8.0.2",
        "jenssegers/mongodb": "^3.9.0",
        "laravel/framework": "^9.2"
    },
    "autoload": {
        "psr-4": {
            "Xxx\\Analysis\\"  : "src/"
        }
    },
    "extra": {
        "laravel": {
            "providers": [
                "Xxx\\Analysis\\Providers\\ServiceProvider"
            ]
        }
    },
    "minimum-stability": "dev"
}

Laravel 框架会识别并加载 "providers" 下面的这个 "Xxx\Analysis\Providers\ServiceProvider" 这个服务提供者类,并在对应的时机调用其 register() 和 boot() 方法。你将在这两个方法内随框架注册或引导自己包内的逻辑。

1年前 评论

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