Подтвердить что ты не робот

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

Я начинаю изучать Laravel, но я не понимаю концепцию Service Container.

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

4b9b3361

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

Ответ 2

Контейнер Laravel создает экземпляр для полного приложения из служб (класса) Нам не нужно создавать instance для нашего приложения, например

$myclass = new MyClass();
$mymethod = $myclass->myMethod();

App:: привязка

Сначала мы переходим к статическому методу связывания связывания класса App. bind просто привязывает ваш класс instance (объект) к приложению, не более того.

App::bind('myapp', function(){
    return new MyClass();
});

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

$myclass = App::make(MyClass::class);
$mymethod = $myclass->myMethod();

App:: одноточечно

В приведенном выше примере, когда мы будем называть метод make, тогда он генерирует каждый раз новый instance класса, поэтому у Laravel есть довольно решение для Singleton Мы можем привязать object к нашему приложению методом Singleton.

App::singleton(MyClass::class, function(){
    return new MyClass();
});

Мы можем решить метод make. Теперь мы всегда получали тот же самый экземпляр из этого метода.

$myclass = App::make(MyClass::class);
$mymethod = $myclass->myMethod();

App:: экземпляр Мы можем привязать экземпляр к контейнеру, и мы всегда будем возвращать тот же самый экземпляр, используя метод 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
      );
  }
}

Заключение. Сервисный контейнер помогает создать объект класса или услуги.