Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.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 IoC容器-绑定一个单例,然后在不使用时返回它';我没有原始参数_Laravel_Singleton_Ioc Container - Fatal编程技术网

Laravel IoC容器-绑定一个单例,然后在不使用时返回它';我没有原始参数

Laravel IoC容器-绑定一个单例,然后在不使用时返回它';我没有原始参数,laravel,singleton,ioc-container,Laravel,Singleton,Ioc Container,我们正在试着登记一个单身汉 $this->app->singleton('blah',函数($app,$options){ 返回$app->makeWith(Something::class,$options); }); 在Something::classwelogger('started') 然后,我们通过控制器中的容器创建类,例如 $something=app() 我们检查日志,您可以看到已启动 然后在其他地方,我们尝试将其从容器中拉出 $instance=resolve('blah')

我们正在试着登记一个单身汉

$this->app->singleton('blah',函数($app,$options){
返回$app->makeWith(Something::class,$options);
});
Something::class
we
logger('started')

然后,我们通过控制器中的容器创建类,例如

$something=app()
我们检查日志,您可以看到
已启动

然后在其他地方,我们尝试将其从容器中拉出

$instance=resolve('blah');
但是,日志显示另一个
已启动


这表明容器返回的实例与构造执行两次的实例不同

这可能是因为当我们调用
resolve
时,传递的选项与实例化时的选项不同


如果是这样,我们如何在不设置静态变量的情况下解决这个问题

无法创建单例并同时使用参数。以下是
Container.php
中的相关代码:

//如果该类型的实例当前作为单例管理,我们将
//只返回一个现有实例,而不是实例化新实例
//因此开发人员每次都可以使用相同的对象实例。
如果(isset($this->instances[$abstract])&&!$needsContextualBuild){
返回$this->instances[$abstract];
}
然后

//如果请求的类型注册为singleton,我们将要缓存掉它
//将实例存储在“内存”中,以便我们稍后可以返回它,而无需创建
//对象的每个后续请求上的全新实例。
如果($this->isShared($abstract)&&!$needsContextualBuild){
$this->instances[$abstract]=$object;
}
请注意,
$needsContextualBuild
如果实例是使用makeWith和参数创建的(除了具有上下文绑定时),则为true

如果希望无参数的
resolve
始终解析上次解析的实例,可以执行以下操作:

//Bind or singleton doesn't matter now
$this->app->bind('blah', function ($app, $options) { 
    return $app->makeWith(Something::class, $options);
});
$this->app->afterResolving('blah', function ($resolvedObject) {
     $this->app->instance('blah', $resolvedObject);
});

$this->app->makeWith('blah', [ 'a' => 'b' ]); //New object 1
$this->app->make('blah'); //Reused object 1
$this->app->makeWith('blah', [ 'a' => 'b' ]); //New object 2
$this->app->make('blah'); //Reused object 2

请注意,使用不同上下文解析同一别名仍将解析新对象,并将该对象绑定为
'blah'
的默认实例

谢谢,我会看看是否可以在解决后将其替换为使用您的
技术,并在我参与项目后向您汇报:)谢谢