Поиск…
Связывание интерфейса с внедрением
В методе register
Service Provider мы можем привязать интерфейс к реализации:
public function register()
{
App::bind( UserRepositoryInterface::class, EloquentUserRepository::class );
}
С этого момента каждый раз, когда приложение понадобится экземпляр UserRepositoryInterface
, Laravel автоматически UserRepositoryInterface
новый экземпляр EloquentUserRepository
:
//this will get back an instance of EloquentUserRepository
$repo = App::make( UserRepositoryInterface:class );
Связывание экземпляра
Мы можем использовать Service Container как реестр, привязывая экземпляр объекта в нем и возвращая его, когда нам это нужно:
// Create an instance.
$john = new User('John');
// Bind it to the service container.
App::instance('the-user', $john);
// ...somewhere and/or in another class...
// Get back the instance
$john = App::make('the-user');
Привязка синглтона к сервисному контейнеру
Мы можем связать класс как Singleton:
public function register()
{
App::singleton('my-database', function()
{
return new Database();
});
}
Таким образом, в первый раз, когда экземпляр 'my-database'
будет запрашиваться в контейнере службы, будет создан новый экземпляр. Все последующие запросы этого класса вернут первый созданный экземпляр:
//a new instance of Database is created
$db = App::make('my-database');
//the same instance created before is returned
$anotherDb = App::make('my-database');
Вступление
Контейнер сервисов является основным объектом приложения. Он может использоваться в качестве контейнера для инъекций зависимостей и реестра для приложения путем определения привязок в поставщиках услуг
Поставщики услуг - это классы, где мы определяем способ создания наших классов обслуживания через приложение, загрузку их конфигурации и привязку интерфейсов к реализациям
Службы - это классы, которые объединяют одну или несколько взаимосвязанных логических задач
Использование контейнер-контейнера в качестве контейнера для инъекций зависимостей
Мы можем использовать контейнер обслуживания как контейнер для инъекций зависимостей, связывая процесс создания объектов со своими зависимостями в одной точке приложения
Предположим, что для создания PdfCreator
нужны два объекта в качестве зависимостей; каждый раз, когда нам нужно создать экземпляр PdfCreator
, мы должны передать эти зависимости в конструктор che. Используя контейнер сервисов как DIC, мы определяем создание PdfCreator
в определении привязки, принимая требуемую зависимость напрямую из Service Container:
App:bind('pdf-creator', function($app) {
// Get the needed dependencies from the service container.
$pdfRender = $app->make('pdf-render');
$templateManager = $app->make('template-manager');
// Create the instance passing the needed dependencies.
return new PdfCreator( $pdfRender, $templateManager );
});
Затем, в каждой точке нашего приложения, чтобы получить новый PdfCreator
, мы можем просто сделать:
$pdfCreator = App::make('pdf-creator');
И контейнер службы создаст новый экземпляр вместе с необходимыми зависимостями для нас.