Laravel (5.7) Сервисный контейнер
Контейнер сервисов в Laravel - это контейнер внедрения зависимостей и реестр для приложения. Преимущества использования сервисного контейнера перед созданием вручную ваших объектов:
Способность управлять зависимостями класса от создания объекта:
Вы определяете, как объект должен быть создан в одной точке приложения (привязка), и каждый раз, когда вам нужно создать новый экземпляр, вы просто запрашиваете его в контейнере службы, и он создаст его для вас вместе с требуемым Например, вместо создания объектов вручную с новым ключевым словом:
//everytime 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, когда в некоторой части приложения требуется интерфейс (то есть в конструкторе контроллера), конкретный класс автоматически создается контейнером службы. Изменение конкретного класса в привязке изменит конкретные объекты, созданные во всех ваших приложениях:
//every time 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');
В заключение, по сути, Service Container - это объект Application: он расширяет класс Container, получая все функциональные возможности контейнера.
Предыдущий: Laravel (5.7) Запрос жизненного цикла
Далее: Поставщики услуг Laravel (5.7)
Новый контент: Composer: менеджер зависимостей для PHP , R программирования