Какова концепция Service Container в Laravel?

Я начинаю заглядывать в Laravel, но я не понимаю понятия Service Container.

Как это работает и что разработчики должны знать, чтобы полностью использовать эту концепцию в Laravel?

Контейнер обслуживания в Laravel – это контейнер для инъекций зависимостей и реестр для приложения

Преимущества использования Контейнера служб для создания вручную ваших объектов:

Способность управлять зависимостями классов при создании объектов

Вы определяете, как объект должен быть создан в одной точке приложения (привязка), и каждый раз, когда вам нужно создать новый экземпляр, вы просто запрашиваете его в контейнере службы, и он создаст его для вас вместе с требуемым зависимости

Например, вместо создания объектов вручную с new ключевым словом:

 //every time we need YourClass we should pass the dependency manually $instance = new YourClass($dependency); 

вы можете зарегистрировать привязку в контейнере сервисов:

 //add a binding for the class YourClass App::bind( YourClass::class, function() { //do some preliminary work: create the needed dependencies $dependency = new DepClass( config('some.value') ); //create and return the object with his dependencies return new YourClass( $dependency ); }); 

и создать экземпляр через контейнер службы с помощью:

 //no need to create the YourClass dependencies, the SC will do that for us! $instance = App::make( YourClass::class ); 

Связывание интерфейсов с конкретными классами

При автоматическом введении зависимостей Laravel, когда интерфейс требуется в какой-либо части приложения (т. Е. В конструкторе контроллера), конкретный класс автоматически создается контейнером сервисов. Изменение конкретного класса в привязке изменит конкретные объекты, созданные через все ваши приложения:

 //everityme a UserRepositoryInterface is requested, create an EloquentUserRepository App::bind( UserRepositoryInterface::class, EloquentUserRepository::class ); //from now on, create a TestUserRepository App::bind( UserRepositoryInterface::class, TestUserRepository::class ); 

Использование контейнера сервисов в качестве реестра

Вы можете создавать и хранить уникальные экземпляры объектов в контейнере и возвращать их позже: используя метод App::instance для создания привязки и, таким образом, используя контейнер в качестве реестра.

 // Create an instance. $kevin = new User('Kevin'); // Bind it to the service container. App::instance('the-user', $kevin); // ...somewhere and/or in another class... // Get back the instance $kevin = App::make('the-user'); 

В качестве окончательной заметки, по существу, контейнер обслуживания – это объект Application : он расширяет класс Container , получая все функциональные возможности контейнера