Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel-服务容器中单例绑定和实例绑定之间的区别_Laravel_Binding - Fatal编程技术网

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

Laravel-服务容器中单例绑定和实例绑定之间的区别,laravel,binding,Laravel,Binding,在Laravel的服务容器中,我可以绑定singleton和instance。从拉雷维尔 绑定单例 singleton方法将类或接口绑定到只应解析一次的容器中。解析单例绑定后,后续调用容器时将返回相同的对象实例: $this->app->singleton('HelpSpot\API', function ($app) { return new HelpSpot\API($app->make('HttpClient')); }); $api = new HelpSpo

在Laravel的服务容器中,我可以绑定singleton和instance。从拉雷维尔

绑定单例

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

$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);
绑定实例

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

$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)为什么我们需要两种绑定选项

singleton
instance
这两个概念非常相似。事实上,唯一的区别是传入类/接口或对象

单件文档:

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

实例文档

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

为什么我们两者都需要? 这个问题的答案可能源于拉雷维尔哲学。从我在Laravel提供的大多数功能中看到的情况来看,解决问题的方法不止一种。感觉这也是其中之一。在某些情况下,
singleton
instance
的使用可能会有细微的差异

单例使用 使用
singleton
将有助于简化应用程序,因为如果不使用这些类/接口,就不会创建它们

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

“在某些情况下,您可能已经创建了一个对象,但仍然需要将其注入到其他地方”-如果我在其他地方创建了该对象,我将如何从服务容器中访问该对象?您能举个例子吗?@IstiaqueAhmed让我们假设您正在创建一些功能,并且您想要创建一些对象,这些对象可以在任何地方访问,但基于实际情况。例如:用户已被锁定,您创建了一个
LockedUser
记录。但在构建通知视图时使用此记录将非常好。绑定实例将允许您执行以下操作:``$record=LockedUser::create([/*此处有些数据*/]);app()->instance('locked_record',$record);//后面的代码$model=app('locked_record');//万岁$从上面返回的记录```