gpt4 book ai didi

laravel - 在 Laravel 中多次构建单例绑定(bind)

转载 作者:行者123 更新时间:2023-12-01 15:16:06 25 4
gpt4 key购买 nike

在我的服务提供者中,我将一个类与单例绑定(bind):

public function register()
{
$this->app->singleton('ResourceContainer', function($app){
return new ResourceContainer();
});
}

laravel doumentation 说这个类将被解析一次并返回相同的对象:

The singleton method binds a class or interface into the container that should only be resolved one time. Once a singleton binding is resolved, the same object instance will be returned on subsequent calls into the container:



但在我的应用程序中, ResourceContainer 的构造函数被调用两次。

我想在 serviceprovider 的 boot 方法中调用这个实例:
public function boot()
{
$resourceContainer = $this->app->make('ResourceContainer');

我将类注入(inject) Controller 中:
public function index(ResourceContainer $container, $resource){

当我调试时,ResourceContainer 的构造函数被调用了两次。我在 Controller 中得到的对象与在服务提供者的引导方法中不同。

最佳答案

原因是您正在请求不同的对象。它基本上归结为这两行代码:

$resourceContainer = $this->app->make('ResourceContainer');
public function index(ResourceContainer $container) { ... } // simplified

因为您很可能没有 ResourceContainer类位于全局命名空间中,但可能类似于 App\Services\ResourceContainer ,这是将从服务容器请求的名称。所以类型提示类实际上会调用 $this->app->make('App\Services\ResourceContainer')由于该类位于该 namespace 中,因此在后台。

因此解决方案相当简单:在其类名下注册单例并将手动调用更改为 make($class) .类型提示将开箱即用。
public function register()
{
$this->app->singleton(ResourceContainer::class, function($app) {
return new ResourceContainer();
});
}

关于laravel - 在 Laravel 中多次构建单例绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53130238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com