在提供者内部绑定 Laravel 服务提供者的依赖?
Binding the dependency of a Laravel Service Provider inside the provider itself?
我刚刚开始掌握服务提供商和 IoC 容器的窍门,但有一件事让我感到困惑。我有一个 SpamServiceProvider,它需要另外两个 classes 才能运行。然而,其中一个 classes,InvalidKeywords,有一个数组 $blacklist 参数,需要传递给它的构造函数。
如果我在 AppServiceProvider 中注册 class 并传入 $blacklist 数组,一切正常。但是,如果我尝试在 SpamServiceProvider 中绑定 class,它不会将 $blacklist 注入 InvalidKeywords 构造函数。
所以我想我的问题是这是为什么?有没有办法将这样的绑定保存在一个容器中,或者我只需要在 AppServiceProvider 中绑定 InvalidKeywords?
这个有效
class SpamServiceProvider extends ServiceProvider
{
/**
* Indicates if loading of the provider is deferred.
*
* @var bool
*/
protected $defer = true;
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register services.
*
* @return void
*/
public function register()
{
$this->app->bind(SpamManager::class, function ($app) {
return new SpamManager(new InvalidKeywords, new RepeatedCharacters);
});
}
}
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->app->bind(InvalidKeywords::class, function ($app) {
return new InvalidKeywords(config('spam.blacklist'));
});
}
}
这行不通
class SpamServiceProvider extends ServiceProvider
{
/**
* Indicates if loading of the provider is deferred.
*
* @var bool
*/
protected $defer = true;
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register services.
*
* @return void
*/
public function register()
{
$this->app->bind(InvalidKeywords::class, function ($app) {
return new InvalidKeywords(config('spam.blacklist'));
});
$this->app->bind(SpamManager::class, function ($app) {
return new SpamManager(new InvalidKeywords, new RepeatedCharacters);
});
}
}
在第二种情况下,您没有从容器中解析 InvalidKeywords
class,只是创建了一个新实例。相反,在创建 SpamManager
:
时尝试使用 app
或 resolve
助手
$this->app->bind(SpamManager::class, function ($app) {
return new SpamManager(resolve(InvalidKeywords::class), resolve(RepeatedCharacters::class));
});
// or
$this->app->bind(SpamManager::class, function ($app) {
return new SpamManager(app(InvalidKeywords::class), app(RepeatedCharacters::class));
});
我也会用 InvalidKeywords
创建一个单例:
$this->app->singleton(InvalidKeywords::class, function ($app) {
return new InvalidKeywords(config('spam.blacklist'));
});
我刚刚开始掌握服务提供商和 IoC 容器的窍门,但有一件事让我感到困惑。我有一个 SpamServiceProvider,它需要另外两个 classes 才能运行。然而,其中一个 classes,InvalidKeywords,有一个数组 $blacklist 参数,需要传递给它的构造函数。
如果我在 AppServiceProvider 中注册 class 并传入 $blacklist 数组,一切正常。但是,如果我尝试在 SpamServiceProvider 中绑定 class,它不会将 $blacklist 注入 InvalidKeywords 构造函数。
所以我想我的问题是这是为什么?有没有办法将这样的绑定保存在一个容器中,或者我只需要在 AppServiceProvider 中绑定 InvalidKeywords?
这个有效
class SpamServiceProvider extends ServiceProvider
{
/**
* Indicates if loading of the provider is deferred.
*
* @var bool
*/
protected $defer = true;
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register services.
*
* @return void
*/
public function register()
{
$this->app->bind(SpamManager::class, function ($app) {
return new SpamManager(new InvalidKeywords, new RepeatedCharacters);
});
}
}
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->app->bind(InvalidKeywords::class, function ($app) {
return new InvalidKeywords(config('spam.blacklist'));
});
}
}
这行不通
class SpamServiceProvider extends ServiceProvider
{
/**
* Indicates if loading of the provider is deferred.
*
* @var bool
*/
protected $defer = true;
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register services.
*
* @return void
*/
public function register()
{
$this->app->bind(InvalidKeywords::class, function ($app) {
return new InvalidKeywords(config('spam.blacklist'));
});
$this->app->bind(SpamManager::class, function ($app) {
return new SpamManager(new InvalidKeywords, new RepeatedCharacters);
});
}
}
在第二种情况下,您没有从容器中解析 InvalidKeywords
class,只是创建了一个新实例。相反,在创建 SpamManager
:
app
或 resolve
助手
$this->app->bind(SpamManager::class, function ($app) {
return new SpamManager(resolve(InvalidKeywords::class), resolve(RepeatedCharacters::class));
});
// or
$this->app->bind(SpamManager::class, function ($app) {
return new SpamManager(app(InvalidKeywords::class), app(RepeatedCharacters::class));
});
我也会用 InvalidKeywords
创建一个单例:
$this->app->singleton(InvalidKeywords::class, function ($app) {
return new InvalidKeywords(config('spam.blacklist'));
});