2014-06-24 17 views
5

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.

+3

Hai provato a chiamare App :: offsetUnset ('Thing') prima di rebinding dell'oggetto? –

+1

@FractalizeR Non l'avevo - funziona, grazie! – Leng

+1

Prego :) –

risposta

4

Il problema sembra essere in Illuminate\Container\Container nel metodo rebound. Questo metodo viene chiamato logicamente solo quando si effettua il rebinding, quindi non viene chiamato la prima volta, ma viene chiamato le volte successive. E puoi vedere che l'istanza viene creata in preparazione per i callback di ritorno.

/** 
* Fire the "rebound" callbacks for the given abstract type. 
* 
* @param string $abstract 
* @return void 
*/ 
protected function rebound($abstract) 
{ 
    $instance = $this->make($abstract); 

    foreach ($this->getReboundCallbacks($abstract) as $callback) 
    { 
     call_user_func($callback, $this, $instance); 
    } 
} 

FractalizeR è giusto, chiamando App::offsetUnset('Thing') beforing vincolante di nuovo non chiama il metodo __construct.

+0

Ah, capisco. Grazie per il tuo tempo Dwenaus, e grazie sia a te che a Fractilize per la soluzione. – Leng

Problemi correlati