Laravel 如何延迟在单个服务提供商中列出的多个绑定?
How does Laravel defer multiple bindings all listed in a single service provider?
我希望我的所有存储库都列在一个服务提供商中,但我不希望它们一次全部加载...
考虑以下服务提供商:
class RepositoryServiceProvider extends ServiceProvider {
protected $defer = true;
public function register()
{
$this->app->bind(
'App\Repositories\Contracts\FooRepository',
'App\Repositories\SQL\FooSQLRepository');
$this->app->bind(
'App\Repositories\Contracts\BarRepository',
'App\Repositories\SQL\BarSQLRepository');
// and more to be added later...
}
public function provides()
{
// Will it defer and load all these at once? Or only the one(s) needed?
return ['App\Repositories\Contracts\FooRepository',
'App\Repositories\Contracts\BarRepository'];
}
}
According to the Laravel docs,我可以将绑定的注册推迟到需要的时候。但是,当我在单个服务提供商中添加多个绑定时,这是否有效?我的具体意思是,它会延迟然后加载 所有 还是加载 仅需要的那个 ?
Laravel 将注册所有绑定,即使只需要一个。延迟功能实际上非常简单。首先,创建 provides()
中条目和实际提供者的映射:
Illuminate\Foundation\ProviderRepository@compileManifest
if ($instance->isDeferred())
{
foreach ($instance->provides() as $service)
{
$manifest['deferred'][$service] = $provider;
}
$manifest['when'][$provider] = $instance->when();
}
然后在 Illuminate\Foundation\Application
中调用 make()
时...
if (isset($this->deferredServices[$abstract]))
{
$this->loadDeferredProvider($abstract);
}
...并且绑定与延迟提供程序之一匹配,它将在此处结束:
Illuminate\Foundation\Application@registerDeferredProvider
$this->register($instance = new $provider($this));
if ( ! $this->booted)
{
$this->booting(function() use ($instance)
{
$this->bootProvider($instance);
});
}
如您所知,现在提供商已照常注册,这意味着 register()
和 boot()
被调用。如果您考虑一下,甚至不可能从服务提供商加载一个绑定而不包含其他绑定,因为它全部在一个方法中完成。
我希望我的所有存储库都列在一个服务提供商中,但我不希望它们一次全部加载...
考虑以下服务提供商:
class RepositoryServiceProvider extends ServiceProvider {
protected $defer = true;
public function register()
{
$this->app->bind(
'App\Repositories\Contracts\FooRepository',
'App\Repositories\SQL\FooSQLRepository');
$this->app->bind(
'App\Repositories\Contracts\BarRepository',
'App\Repositories\SQL\BarSQLRepository');
// and more to be added later...
}
public function provides()
{
// Will it defer and load all these at once? Or only the one(s) needed?
return ['App\Repositories\Contracts\FooRepository',
'App\Repositories\Contracts\BarRepository'];
}
}
According to the Laravel docs,我可以将绑定的注册推迟到需要的时候。但是,当我在单个服务提供商中添加多个绑定时,这是否有效?我的具体意思是,它会延迟然后加载 所有 还是加载 仅需要的那个 ?
Laravel 将注册所有绑定,即使只需要一个。延迟功能实际上非常简单。首先,创建 provides()
中条目和实际提供者的映射:
Illuminate\Foundation\ProviderRepository@compileManifest
if ($instance->isDeferred())
{
foreach ($instance->provides() as $service)
{
$manifest['deferred'][$service] = $provider;
}
$manifest['when'][$provider] = $instance->when();
}
然后在 Illuminate\Foundation\Application
中调用 make()
时...
if (isset($this->deferredServices[$abstract]))
{
$this->loadDeferredProvider($abstract);
}
...并且绑定与延迟提供程序之一匹配,它将在此处结束:
Illuminate\Foundation\Application@registerDeferredProvider
$this->register($instance = new $provider($this));
if ( ! $this->booted)
{
$this->booting(function() use ($instance)
{
$this->bootProvider($instance);
});
}
如您所知,现在提供商已照常注册,这意味着 register()
和 boot()
被调用。如果您考虑一下,甚至不可能从服务提供商加载一个绑定而不包含其他绑定,因为它全部在一个方法中完成。