라라벨에서 서비스 컨테이너의 개념은?
라라벨에 대해 알아보려고 하는데 서비스 컨테이너라는 개념을 이해하지 못합니다.
Laravel에서 이 개념을 완전히 활용하기 위해 개발자들이 알아야 할 것은 무엇이며 어떻게 작동 방식은 무엇입니까?
TL;DR 서비스 컨테이너는Application
object: 확장합니다.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
'programing' 카테고리의 다른 글
python win32 COM 마감 엑셀 워크북 (0) | 2023.09.14 |
---|---|
팬더 데이터 프레임에 대한 그룹별 및 pivot_table의 차이 (0) | 2023.09.14 |
주석에 포함되지 않은 경우 특정 내용을 선택하는 정규식 (0) | 2023.09.14 |
Python에서 *.wav 파일 읽기 (0) | 2023.09.14 |
Woocommerce의 특정 제품 카테고리에 대한 사용자 정의 단일 제품 템플릿 사용 (0) | 2023.09.14 |