2014-06-24 83 views
5

如果一個類綁定到的IoC ...Laravel:綁定到IoC容器

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

然後,ThingOne對象將永遠,除非你叫App::make('Thing')實例化。這是一件好事。

但是,如果您嘗試覆蓋綁定:

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

...然後ThingTwo對象和ThingThree對象將被實例化(並呼籲它們的構造函數),即使你從來沒有所謂App::make('Thing')!這是一件壞事!爲什麼,以及如何防止這種情況發生? IoC如果不允許我們覆蓋綁定,那麼我們可以擴展包和什麼? (這就是我想要做什麼:綁定類國際奧委會我的包,然後實現在其他項目上的包時,可選覆蓋它們)

順便說一句,這種情況是否使用bind()singleton()沒有區別。

非常感謝您的任何指導。

+3

你有沒有嘗試在重新綁定對象之前調用App :: offsetUnset('Thing')? –

+1

@FractalizeR我沒有 - 這工作,謝謝! – Leng

+1

歡迎您:) –

回答

4

該問題似乎在rebound方法中的Illuminate\Container\Container中。邏輯上,該方法僅在重新綁定時調用,因此它不是第一次調用,而是稱爲後續時間。你可以看到這個實例是爲反彈回調做準備的。

/** 
* 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是正確的,叫App::offsetUnset('Thing') beforing再結合它不會調用__construct方法。

+0

啊,我明白了。感謝您的時間dwenaus,並感謝您和Fractilize的解決方案。 – Leng