在提供者内部绑定 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:

时尝试使用 appresolve 助手
$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'));
});