programing

라라벨에서 서비스 컨테이너의 개념은?

codeshow 2023. 9. 14. 23:44
반응형

라라벨에서 서비스 컨테이너의 개념은?

라라벨에 대해 알아보려고 하는데 서비스 컨테이너라는 개념을 이해하지 못합니다.

Laravel에서 이 개념을 완전히 활용하기 위해 개발자들이 알아야 할 것은 무엇이며 어떻게 작동 방식은 무엇입니까?

TL;DR 서비스 컨테이너는Applicationobject: 확장합니다.Container컨테이너의 모든 기능을 얻는 수업.

수동으로 개체를 생성하는 것보다 서비스 컨테이너를 사용하는 것의 장점은 다음과 같습니다.

객체 생성에 대한 클래스 종속성 관리 기능

애플리케이션의 한 지점(바인딩)에서 개체를 생성하는 방법을 정의하고 새 인스턴스를 생성해야 할 때마다 서비스 컨테이너에 요청하면 개체가 필요한 종속성과 함께 생성됩니다.

예를 들어 개체를 수동으로 생성하는 대신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'); 

Laravel container create instance for full application from services(클래스)를 생성할 필요가 없습니다.instance우리의 적용을 위해, 예를 들어.

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

앱::bind

먼저, 우리는 고정된 방법을 살펴볼 것입니다.App학급.bind당신의 수업을 구속하는 것 뿐입니다.instance(객체가) 애플리케이션과 함께, 그 이상은 아닙니다.

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

이제, 우리는 이 오브젝트를 우리의 애플리케이션에 사용할 수 있습니다.make정태적인 방법App학급.

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

앱::싱글톤

위의 예에서 우리가 언제 전화를 할 것인지는make메소드는 매번 새로 생성됩니다.instance물론, So Laravel은 꽤 좋은 해결책을 가지고 있습니다.Singleton우리는 그것을 묶을 수 있습니다.object우리측의 신청에 의하여.singleton방법.

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

우리는 해결할 수 있습니다.make◦. .이제 우리는 항상 이 방법으로부터 정확하게 동일한 인스턴스를 받아왔습니다.

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

수 있으며 App:::instance를 사용하여 한 인스턴스를 합니다.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
      );
  }
}

결론:서비스 컨테이너는 클래스 또는 서비스의 개체를 만드는 데 도움이 됩니다.

언급URL : https://stackoverflow.com/questions/37038830/what-is-the-concept-of-service-container-in-laravel

반응형