Se si associa una classe al CIO ...laravel: Legatura di IoC Container
App::bind('Thing', function() {
return new \ThingOne;
});
Poi, un oggetto ThingOne
sarà mai un'istanza a meno che non si chiama App::make('Thing')
. Questa è una buona cosa.
Tuttavia, se si tenta di sovrascrivere quello che lega:
App::bind('Thing', function() {
return new \ThingOne;
});
App::bind('Thing', function() {
return new \ThingTwo;
});
App::bind('Thing', function() {
return new \ThingThree;
});
... poi un oggetto ThingTwo
e un oggetto ThingThree
vengono istanziati (ed i loro costruttori chiamati), anche se non hai mai chiamato App::make('Thing')
! Questa è una brutta cosa! Perché e come può essere prevenuto? A che scopo serve IoC se non permetterci di sovrascrivere i binding in modo che possiamo estendere i pacchetti e quant'altro? (Questo è quello che mi piacerebbe fare. Classi legano al CIO nei miei pacchetti e quindi opzionalmente sovrascriverli quando l'attuazione di tali pacchetti su altri progetti)
btw, questo accade se si utilizza bind()
o singleton()
con nessuna differenza .
Grazie mille per qualsiasi consiglio.
Hai provato a chiamare App :: offsetUnset ('Thing') prima di rebinding dell'oggetto? –
@FractalizeR Non l'avevo - funziona, grazie! – Leng
Prego :) –