Ответ 1
Service Container в Laravel - это контейнер для инъекций зависимостей и реестр для приложения
Преимущества использования контейнера Service для создания вручную ваших объектов:
Емкость для управления зависимостями класса при создании объекта
Вы определяете, как объект должен быть создан в одной точке приложения (привязка), и каждый раз, когда вам нужно создать новый экземпляр, вы просто запрашиваете его в контейнере службы, и он создаст его для вас, вдоль с требуемыми зависимостями
Например, вместо создания объектов вручную с ключевым словом 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
, получая все функциональные возможности контейнера