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
welogger('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'
的默认实例 谢谢,我会看看是否可以在解决后将其替换为使用您的
技术,并在我参与项目后向您汇报:)谢谢