为什么laravel-IoC不为我的类提供我的方法


Why does laravel IoC does not provisioning my class with my method?

我不明白为什么laravel试图在不使用我的方法的情况下创建我的类。我可以看到IoC绑定被执行(显示了POINT 1)。但singleton方法从未被执行过。为什么?

在我的服务提供商(未延期):

/**
 * Register the service provider.
 *
 * @return void
 */
public function register()
{
    echo "POINT 1"; // I can see this one
    $this->app->singleton('App'Services'FooBar::class, function($app)
    {
        echo "POINT 2'n"; // Does not comes here
        return new FooBar($params);
    });
}

在创建类时,我尝试使用类型提示来解决依赖关系:

class Test
{
    public function __construct(FooBar $fooBar)
    {
    }
}

我看到laravel试图创建FooBar来注入它,但无法解决FooBar的依赖关系。如果laravel会调用服务提供商回调,它们可以得到解决,但它没有。为什么?如何让laravel为该类使用回调?

使用boot()方法来启动服务,而不是关闭(这将不起作用)。

/**
 * @param 'App'Services'FooBar $foobar
 */
public function boot('App'Services'FooBar $foobar)
{
    $foobar->setOptions(['option' => 'value']);
}

它将在服务实例化后立即启动。

这是因为当您将类绑定到IoC容器时,您不会立即调用闭包。相反,当你需要从容器中对你的类执行一些操作时,你可以调用App::make('class'),它会触发闭包并给你从中返回的值

/**
 * Register the service provider.
 *
 * @return void
 */
public function register()
{
    echo "POINT 1"; // I can see this one
    $this->app->singleton('App'Services'FooBar::class, function($app)
    {
        echo "POINT 2'n"; // Does not comes here
        return new FooBar($params);
    });
    $this->app->make('App'Services'FooBar::class); //here POINT 2 will be called first.
}