Laravel - 服务容器中单例和实例绑定之间的区别

Ist*_*med 4 php laravel laravel-service-container

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

绑定单例

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

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

绑定实例

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

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

$this->app->instance('HelpSpot\API', $api);
Run Code Online (Sandbox Code Playgroud)

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

或者还有其他的解释吗?

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

Ptr*_*Ton 7

singleton和之间的区别instance

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

单例文档:

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

实例文档

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

为什么我们两者都需要?

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

单例使用

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

实例使用情况

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

  • @IstiaqueAhmed 假设您正在创建一些功能,并且想要创建一些可以随处访问的对象,但基于或实际情况。例如:用户已被锁定,您创建了一条“LockedUser”记录。但在构建通知视图等时使用此记录会非常好。绑定实例将允许您执行如下操作: ``` $record = LockedUser::create([/* 这里有一些数据 */]); app()->instance('locked_record', $record); // 后面的代码 $model = app('locked_record'); // 万岁!上面的$记录已返回!```` (2认同)