§10 Использование IoC контейнера в Laravel 4.2

Категория: Laravel

Использование IoC позволяет избежать жестко заданных зависимостей путем определения зависимостей во время выполнения приложения. Также IoC упрощает использование моков (класс-заглушка) при Unit-тестировании.

Поместить данные в IoC контейнер

Поместить в контейнер функцию-замыкание (может возвращать объект или любой другой тип данных):

App::bind('someName', function ($app) {
  // Каждый раз будет создваться новый экземпляр
  return new SomeClass($app->config);
});

Добавить в контейнер интерфейс:

App::bind('OauthProviderInterface', 'FacebookProviderInterface');

Поместить в контейнер существующий экземпляр класса:

App::instance('someName', $someObject);

Поместить в контейнер Singleton (случайное число будет вычислено только при первом обращении к сервису):

App::singleton('someName', function ($app) {
  return rand(0, 10000);
});

// или:

App::bindShared('someName', function ($app) {
  return rand(0, 10000);
});

Получить данные из IoC контейнера

Для получения данных из IoC контейнера используйте метод App::make:

$someName = App::make('someName');

Автоматическое определение и внедрение зависимостей

Даже если вы не регистрировали класс в IoC контейнере вручную - он все равно попытается определить зависимость автоматически, используя поиск в контейнере или возможности рефлексии (читает type hints):

namespace MyVendor;

class SomeService
{
  public function __construct(SomeClass $someClassObject)
  {
    $this->object = $someClassObject;
  }
}

$someService = App::make('MyVendor\SomeService');

Событие разрешения зависимости

При каждом разрешении объекта из IoC контейнера возбуждается событие resolving. Слушайте это событие для отслеживания извлеченного объекта:

App::resolvingAny(function ($object) {
  // $object - созданный объект
});

App::resolving('foo', function($foo) {
  //
});

Смотрите также:


#IoC, #DI, #resolving, #service provider, #singleton, #dependency injection

категория: Laravel