Поиск…


Связывание интерфейса с внедрением

В методе 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');

И контейнер службы создаст новый экземпляр вместе с необходимыми зависимостями для нас.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow