§10 Использование IoC контейнера в Laravel 4.2
Использование 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