Я начинаю заглядывать в 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
, получая все функциональные возможности контейнера