短い答え:
あなたのコンパイルしたマニフェストファイルがすでにフレームワークによってコンパイルされています。それは名前のキャッシュされたファイルに書き込みLaravelはアプリケーションをビルドする(とのIoCにサービスプロバイダのすべてを解決します)初めて で
services.php(つまり、マニフェストファイルに置か:
bootstrap/cache/services.php
)。
php artisan clear-compiled
でコンパイルしたコマンドをクリアすると、フレームワークがマニフェストファイルを再構築するようになり、
provides
メソッドが呼び出されることに注意してください。 次の呼び出し/要求では、
provides
メソッドはもはや呼び出されません。
フレームワークブーツの順序は、ほぼこのようなものです:ブートストラッパの
//public/index.php
$app = new Illuminate\Foundation\Application(
realpath(__DIR__.'/../')
);
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
\Illuminate\Foundation\Http\Kernel::__construct();
\Illuminate\Foundation\Http\Kernel::handle();
\Illuminate\Foundation\Http\Kernel::sendRequestThroughRouter();
\Illuminate\Foundation\Http\Kernel::bootstrap();
\Illuminate\Foundation\Application::bootstrapWith();
# where $bootstrapper is a item from \Illuminate\Foundation\Http\Kernel::$bootstrappers
# and $this is instance of \Illuminate\Foundation\Application
\Illuminate\Foundation\Application::make($bootstrapper)->bootstrap($this);
一つは は\Illuminate\Foundation\Application::registerConfiguredProviders()
を呼び出しIlluminate\Foundation\Bootstrap\RegisterProviders
で、最終的に \Illuminate\Foundation\ProviderRepository::__construct()
と呼び出し:
\Illuminate\Foundation\ProviderRepository::load()
\Illuminate\Foundation\ProviderRepository::load()
がありますすべてのサービスプロバイダと呼ばれる、登録されている \Illuminate\Support\ServiceProvider::provides()
もよく呼び出されます。ここ
そして、あなたは(\Illuminate\Foundation\ProviderRepository::load
から)知っておくべき抜粋です。
/**
* Register the application service providers.
*
* @param array $providers
* @return void
*/
public function load(array $providers)
{
$manifest = $this->loadManifest();
// First we will load the service manifest, which contains information on all
// service providers registered with the application and which services it
// provides. This is used to know which services are "deferred" loaders.
if ($this->shouldRecompile($manifest, $providers)) {
$manifest = $this->compileManifest($providers);
}
// Next, we will register events to load the providers for each of the events
// that it has requested. This allows the service provider to defer itself
// while still getting automatically loaded when a certain event occurs.
foreach ($manifest['when'] as $provider => $events) {
$this->registerLoadEvents($provider, $events);
}
// We will go ahead and register all of the eagerly loaded providers with the
// application so their services can be registered with the application as
// a provided service. Then we will set the deferred service list on it.
foreach ($manifest['eager'] as $provider) {
$this->app->register($this->createProvider($provider));
}
$this->app->addDeferredServices($manifest['deferred']);
}
\Illuminate\Foundation\ProviderRepository::compileManifest()
あなたprovides()
メソッドが実行される場所です。
プロバイダーをプロバイダアレイに 'config/app.php'で登録しましたか? – user3158900
@ user3158900はい。私はそれが適切に延期されているとは思わないので、provide()が呼び出されない限り、プロバイダは正常に動作します。 – Julian
Laravelのコンテナは実際にサービスプロバイダに登録されていないクラスのインスタンスを実際に作成できるため、したがって、Laravelがサービスプロバイダーについて知らない場合、それを延期する必要はないと考えられます。 – user3158900