계약
소개
Laravel의 "계약"은 프레임워크에서 제공하는 핵심 서비스를 정의하는 인터페이스 집합입니다. 예를 들어, Illuminate\Contracts\Queue\Queue 계약은 작업 대기열에 필요한 메서드를 정의하고, Illuminate\Contracts\Mail\Mailer 계약은 이메일 전송에 필요한 메서드를 정의합니다.
각 계약에는 프레임워크에서 제공하는 해당 구현이 있습니다. 예를 들어, Laravel은 다양한 드라이버를 사용하여 대기열 구현을 제공하고, Symfony Mailer를 기반으로 하는 메일러 구현을 제공합니다.
모든 Laravel 계약은 자체 GitHub 저장소에 있습니다. 이를 통해 사용 가능한 모든 계약에 대한 빠른 참조 지점과 Laravel 서비스와 상호 작용하는 패키지를 빌드할 때 활용할 수 있는 단일의 분리된 패키지를 제공합니다.
계약 대 퍼사드
Laravel의 퍼사드 및 헬퍼 함수는 서비스 컨테이너에서 계약을 유형 힌트하고 확인하지 않고도 Laravel의 서비스를 활용하는 간단한 방법을 제공합니다. 대부분의 경우 각 퍼사드는 해당 계약이 있습니다.
클래스 생성자에서 이를 요구할 필요가 없는 퍼사드와 달리, 계약을 사용하면 클래스에 대한 명시적 종속성을 정의할 수 있습니다. 일부 개발자는 이러한 방식으로 종속성을 명시적으로 정의하는 것을 선호하므로 계약을 사용하는 것을 선호하는 반면, 다른 개발자는 퍼사드의 편리함을 선호합니다. 일반적으로 대부분의 애플리케이션은 개발 중에 문제없이 퍼사드를 사용할 수 있습니다.
계약을 사용해야 하는 경우
계약 또는 퍼사드를 사용할지 결정하는 것은 개인 취향과 개발 팀의 취향에 달려 있습니다. 계약과 퍼사드 모두 강력하고 잘 테스트된 Laravel 애플리케이션을 만드는 데 사용할 수 있습니다. 계약과 퍼사드는 상호 배타적이지 않습니다. 애플리케이션의 일부에서는 퍼사드를 사용할 수 있고 다른 부분에서는 계약에 의존할 수 있습니다. 클래스 책임을 집중적으로 유지하는 한 계약과 퍼사드를 사용하는 것 사이에서 실질적인 차이점을 거의 알아차리지 못할 것입니다.
일반적으로 대부분의 애플리케이션은 개발 중에 문제없이 퍼사드를 사용할 수 있습니다. 여러 PHP 프레임워크와 통합되는 패키지를 빌드하는 경우 패키지의 composer.json 파일에서 Laravel의 구체적인 구현을 요구할 필요 없이 illuminate/contracts 패키지를 사용하여 Laravel 서비스와의 통합을 정의할 수 있습니다.
계약 사용 방법
그렇다면 계약의 구현을 어떻게 얻을 수 있을까요? 실제로 매우 간단합니다.
Laravel의 많은 클래스 유형은 컨트롤러, 이벤트 리스너, 미들웨어, 대기열 작업, 심지어 라우트 클로저를 포함하여 서비스 컨테이너를 통해 해결됩니다. 따라서 계약의 구현을 얻으려면 해결되는 클래스의 생성자에서 인터페이스를 "타입 힌트"하면 됩니다.
예를 들어, 이 이벤트 리스너를 살펴보십시오.
<?php namespace App\Listeners; use App\Events\OrderWasPlaced;use App\Models\User;use Illuminate\Contracts\Redis\Factory; class CacheOrderInformation{ /** * 새 이벤트 핸들러 인스턴스를 만듭니다. */ public function __construct( protected Factory $redis, ) {} /** * 이벤트를 처리합니다. */ public function handle(OrderWasPlaced $event): void { // ... }}
이벤트 리스너가 해결되면 서비스 컨테이너는 클래스 생성자의 타입 힌트를 읽고 적절한 값을 주입합니다. 서비스 컨테이너에 항목을 등록하는 방법에 대한 자세한 내용은 해당 문서를 확인하십시오.
계약 참조
이 표는 모든 Laravel 계약과 해당 퍼사드에 대한 빠른 참조를 제공합니다.