【问题标题】:Laravel - difference between singleton and instance binding in service containerLaravel - 服务容器中单例和实例绑定之间的区别
【发布时间】:2020-04-25 09:41:47
【问题描述】:

在 Laravel 的服务容器中,我可以同时绑定单例和实例。来自 Laravel doc

绑定单例

单例方法将一个类或接口绑定到只应解析一次的容器中。一旦解决了单例绑定,相同的对象实例将在随后对容器的调用中返回:

$this->app->singleton('HelpSpot\API', function ($app) {
    return new HelpSpot\API($app->make('HttpClient'));
});

绑定实例

您还可以使用实例方法将现有对象实例绑定到容器中。给定的实例将始终在对容器的后续调用中返回:

$api = new HelpSpot\API(new HttpClient);

$this->app->instance('HelpSpot\API', $api);

Q1) 那么这两个概念有什么区别呢?我可以猜测,对于单例绑定,Laravel 在第一次请求时通过内部服务容器机制构建对象本身,然后在后续调用中提供它,而在实例绑定的情况下,服务容器被显式地赋予一个已经构建的对象,它提供给每个请求?

还是有其他解释?

Q2) 为什么我们需要两个绑定选项?

【问题讨论】:

    标签: php laravel laravel-service-container


    【解决方案1】:

    singletoninstance 之间的区别

    这两个概念非常相似。实际上,唯一的区别是您要么传入一个类/接口,要么传入一个对象。

    单例文档:

    单例方法将一个类或接口绑定到只应解析一次的容器中。一旦解决了单例绑定,相同的对象实例将在随后对容器的调用中返回

    实例文档

    您还可以使用实例方法将现有对象实例绑定到容器中。给定的实例将始终在后续调用容器时返回

    为什么我们都需要?

    这个问题的答案可能植根于 Laravel 哲学。从我在 Laravel 提供的大多数功能中看到的情况来看,解决问题的方法不止一种。感觉这也是其中之一。在某些情况下,有些细微的差别可能会使singletoninstance 的使用更可取。

    单例使用

    使用singleton 将有助于保持您的应用程序轻巧,因为如果不使用这些类/接口,则不会创建它们。

    实例使用情况

    在某些情况下,您可能已经创建了一个对象,但仍需要将其注入其他地方。这就是instances 的用武之地。

    【讨论】:

    • '在某些情况下,您可能已经创建了一个对象,但仍需要将其注入其他地方' - 如果我在其他地方创建了该对象,我将如何从服务容器中访问它?能举个例子吗?
    • @IstiaqueAhmed 假设您正在创建一些功能,并且您想要创建一些对象,可在任何地方访问,但基于或实际情况。例如:用户已被锁定,您创建了一个LockedUser 记录。但是在构建通知视图时使用此记录会非常好。绑定一个实例会让你做这样的事情:``` $record = LockedUser::create([/* some data here */]); app()->instance('locked_record', $record); // 稍后在代码中 $model = app('locked_record'); // 万岁!上面的 $record 返回了! ```
    【解决方案2】:

    除了@PtrTon 所说的,不同之处还在于创建实例的时间。使用实例,实例当然是在传递给服务容器之前创建的,这意味着它很早就创建了。虽然使用单例,但实例是第一次创建的,据我所知,在传递实例的示例之后可能需要相当长的时间才能解决绑定。

    【讨论】:

      猜你喜欢
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 2020-04-21
      • 2018-06-14
      相关资源
      最近更新 更多