php - How does Laravel defer multiple bindings all listed in a single service provider? -
i want repositories listed in single service provider, don't want them loaded @ once...
consider service provider below:
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'); // , more added later... } public function provides() { // defer , load these @ once? or one(s) needed? return ['app\repositories\contracts\foorepository', 'app\repositories\contracts\barrepository']; } } according laravel docs, can defer registration of bindings until needed. work when i've added multiple bindings in single service provider? mean, defer , load all or load only 1 needed?
laravel register bindings, if 1 needed. deferred feature works pretty simple. first, map of entries in provides() , actual provider created:
illuminate\foundation\providerrepository@compilemanifest
if ($instance->isdeferred()) { foreach ($instance->provides() $service) { $manifest['deferred'][$service] = $provider; } $manifest['when'][$provider] = $instance->when(); } then when make() called in illuminate\foundation\application...
if (isset($this->deferredservices[$abstract])) { $this->loaddeferredprovider($abstract); } ...and binding matches 1 of deferred provider end here:
illuminate\foundation\application@registerdeferredprovider
$this->register($instance = new $provider($this)); if ( ! $this->booted) { $this->booting(function() use ($instance) { $this->bootprovider($instance); }); } as might able tell, provider registered usual means register() , boot() called. if think it, it's not possible load 1 binding service provider , not include other ones, because it's done in 1 method.
Comments
Post a Comment