Laravel: привязка к контейнеру IoC

#php #class #laravel #inversion-of-control

#php #класс #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, если не для того, чтобы позволить нам перезаписывать привязки, чтобы мы могли расширять пакеты и еще много чего? (Это то, что я хотел бы сделать: привязать классы к IoC в моих пакетах, а затем при необходимости перезаписать их при реализации этих пакетов в других проектах.)

кстати, это происходит независимо от того, используете вы bind() или singleton() без разницы.

Большое вам спасибо за любые рекомендации.

Комментарии:

1. Вы пытались вызвать App::offsetUnset(‘Thing’) перед повторной привязкой объекта?

2. @FractalizeR у меня не было — это работает, спасибо!

Ответ №1:

Проблема, похоже IlluminateContainerContainer , заключается в rebound методе. Этот метод логически вызывается только при повторной привязке, поэтому он вызывается не в первый раз, а в последующие разы. И вы можете видеть, что экземпляр создается при подготовке к обратным вызовам восстановления.

 /**
 * 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') перед повторной привязкой не вызывает метод __construct .

Комментарии:

1. А, понятно. Спасибо за ваше время, dwenaus, и спасибо вам и Fractilize за решение.