【发布时间】:2018-12-03 16:00:06
【问题描述】:
我刚刚开始了解服务提供者和 IoC 容器,但有一件事让我感到困惑。我有一个 SpamServiceProvider 需要另外两个类才能运行。然而,其中一个类 InvalidKeywords 有一个数组 $blacklist 参数,需要将其传递给它的构造函数。
如果我在 AppServiceProvider 中注册该类并传入 $blacklist 数组,则一切正常。但是,如果我尝试在 SpamServiceProvider 中绑定类,它不会将 $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);
});
}
}
【问题讨论】:
标签: php laravel dependency-injection ioc-container