我不明白为什么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.
}