2 ответов:
Служебный контейнерв 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, получая все функциональные возможности контейнера
Контейнер Laravel создает экземпляр для полного приложения из служб (класс) Нам не нужно создавать
instanceдля нашего приложения, как$myclass = new MyClass(); $mymethod = $myclass->myMethod();App:: bind
Сначала мы рассмотрим статический метод bind класса
App.bindпросто связывает ваш классinstance(объект) с приложением, не более.Теперь мы можем использовать этот объект для нашего приложения, используяApp::bind('myapp', function(){ return new MyClass(); });makeстатический метод классаApp.$myclass = App::make(MyClass::class); $mymethod = $myclass->myMethod();Приложение:: singleton
В приведенном выше примере, когда мы собираемся вызвать метод
make, то его генерируют каждый раз новыйinstanceкласса, так что у Laravel есть красивое решение дляSingletonМы можем привязатьobjectк нашему приложению методомsingleton.App::singleton(MyClass::class, function(){ return new MyClass(); });Мы можем быть решены методом
make. Теперь мы всегда получали один и тот же экземпляр от этого метода.$myclass = App::make(MyClass::class); $mymethod = $myclass->myMethod();Приложение:: экземпляр Мы можем привязать экземпляр к контейнеру, и мы всегда будем возвращать то же самое экземпляр, использующий метод
instance.$myclass = new MyClass(); App::instance(MyClass::class, $myclass);Мы можем быть разрешены с помощью
$myclass = App::make(MyClass::class);Мы можем связать интерфейс с помощью
App::instance(MyClassInterface::class, new MyClass);Привязка Реализации
Yaa, у нас есть вопрос, как мы можем реализовать привязку в нашем приложении? Мы можем реализовать привязку в нашем
AppServiceProvider
app/Providers/AppServiceProvider.php namespace App\Providers; use App\SocialProvider; use App\TwitterSocialProvider; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { } /** * Register any application services. * * @return void */ public function register() { $this->app->bind( MyClassInterface::class, MyClass::class ); } }Вывод: сервисный контейнер помогает создать объект класса или сервисы.
Comments