2014-06-24 19 views
5

Jeśli powiązać klasę MKOl ...laravel: Wiązanie z IoC Container

App::bind('Thing', function() { 
    return new \ThingOne; 
}); 

Następnie ThingOne obiekt będzie nigdy być instancja chyba nazwać App::make('Thing'). To jest dobra rzecz.

Jednak przy próbie nadpisania że wiązanie:

App::bind('Thing', function() { 
    return new \ThingOne; 
}); 
App::bind('Thing', function() { 
    return new \ThingTwo; 
}); 
App::bind('Thing', function() { 
    return new \ThingThree; 
}); 

... potem ThingTwo przedmiot i ThingThree obiekt zostanie natychmiast (i ich konstruktorzy nazywa), chociaż nigdy nie nazywa App::make('Thing')! To jest złe! Dlaczego i jak można temu zapobiec? Do czego służy IoC, jeśli nie pozwala nam na nadpisywanie powiązań, abyśmy mogli rozszerzyć pakiety i co dalej? (Oto, co chciałbym zrobić: powiąż klasy z IoC w moich pakietach, a następnie opcjonalnie nadpisz je podczas implementacji pakietów w innych projektach.)

Przy okazji, dzieje się to niezależnie od tego, czy używasz bind() czy singleton() bez różnicy .

Dziękuję bardzo za wskazówki.

+3

Czy próbowałeś wywołać App :: offsetUnset ("Thing") przed ponownym związaniem obiektu? –

+1

@FractalizeR I had not - that does work, thanks! – Leng

+1

Serdecznie zapraszamy :) –

Odpowiedz

4

Problem wydaje się być w Illuminate\Container\Container w metodzie rebound. Ta metoda logicznie jest wywoływana tylko przy ponownym wiązaniu, więc nie jest wywoływana za pierwszym razem, ale nazywana jest kolejnymi czasami. I widać, że instancja jest tworzona w ramach przygotowań do oddzwaniania zwrotnego.

/** 
* 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 ma rację, nazywając App::offsetUnset('Thing') beforing wiążący go ponownie nie wywołać metodę __construct.

+0

Ah, rozumiem. Dziękuję za Twój czas dwenaus, a dzięki tobie i Fractilize za rozwiązanie. – Leng