계약
- 낮은 결합
- 계약 사용 방법
- Introduction
- Laravel의 컨트랙트 집합은 프레임워크에서 핵심 서비스를 정의하는 인터페이스를 제공합니다. 예를 들어 계약은 이메일을 보내는 데 필요한 방법을 정의합니다.
- 각 계약에는 해당 프레임워크에서 제공하는 구현이 있습니다. 예를 들어, Laravel은 여러 드라이버 대기열 구현을 제공하고 SwiftMailer를 사용하여 이메일 계약을 구현합니다. 모든 Laravel 계약은 해당 GitHub 저장소
Contracts Vs. Facades
Laravel의 Facades 및 도우미 기능은 유형 힌트 없이 Laravel 서비스를 사용하는 쉬운 방법을 제공하며 서비스 컨테이너 외부에서 계약을 해결할 수도 있습니다. 대부분의 경우 각 Facade에는 동등한 계약이 있습니다.
종속성을 참조하기 위해 클래스의 생성자가 필요하지 않은 Facade와 달리 계약을 사용하면 클래스에 대한 명시적인 종속성을 정의할 수 있습니다. 일부 개발자는 종속성이 명확하게 정의되는 것을 선호하므로 계약 사용을 선호하는 반면, 다른 개발자는 Facade가 제공하는 편리함을 즐깁니다.
{tip} Facades를 선호하든 Contracts를 선호하든 대부분의 애플리케이션에서는 괜찮습니다. 그러나 확장 패키지를 구축하는 경우 계약 사용을 적극 고려해야 합니다. 계약을 사용하면 패키지 컨텍스트 내에서 테스트하기가 더 쉬워지기 때문입니다.
계약 사용 시기
요약하자면, 계약 또는 파사드 사용 여부는 개인 또는 팀 선호도에 따라 크게 달라집니다. Contracts와 Facades 모두 강력하고 잘 테스트된 Laravel 애플리케이션을 구축하는 데 사용할 수 있습니다. 클래스의 책임을 단순하게 유지하는 한 계약과 Facade 사용 간의 실제 차이는 매우 작다는 것을 알게 될 것입니다.
그러나 계약에 관해 여전히 궁금한 점이 많을 수 있습니다. 예를 들어 인터페이스를 사용하는 이유는 무엇입니까? 인터페이스를 사용하는 것이 더 복잡하지 않나요? 다음 내용("낮은 결합도" 및 "단순성")에서 그 이유를 추출해 보겠습니다.
낮은 결합
먼저 캐시 구현을 위한 높은 결합 코드를 살펴보겠습니다. 다음과 같은 코드가 있다고 가정해 보겠습니다.
<?php namespace App\Orders; class Repository{ /** * 缓存实例. */ protected $cache; /** * 创建一个新的仓库实例. * * @param \SomePackage\Cache\Memcached $cache * @return void */ public function __construct(\SomePackage\Cache\Memcached $cache) { $this->cache = $cache; } /** * 根据 ID 获取订单. * * @param int $id * @return Order */ public function find($id) { if ($this->cache->has($id)) { // } } }
이 클래스에서 코드는 지정된 캐시 구현과 고도로 결합되어 있습니다. 확장 패키지의 특정 캐시 클래스에 의존하기 때문에 결합도가 높습니다. 확장 프로그램의 API가 변경되면 코드도 변경되어야 합니다.
마찬가지로 기본 캐싱 기술(Memcached)을 다른 캐싱 기술(Redis)로 교체하려면 코드 베이스를 다시 수정해야 합니다. 우리 코드베이스는 누가 데이터를 제공했는지, 데이터가 어떻게 제공되었는지에 대해 너무 많이 알면 안 됩니다.
이전 구현 대신 간단한 패키지 독립적인 인터페이스를 사용하여 코드를 개선할 수 있습니다.
<?php namespace App\Orders; use Illuminate\Contracts\Cache\Repository as Cache; class Repository{ /** * 缓存实例. */ protected $cache; /** * 创建一个新的仓库实例. * * @param Cache $cache * @return void */ public function __construct(Cache $cache) { $this->cache = $cache; } }
이제 코드는 특정 패키지에 연결되지 않으며 Laravel도 관련이 없습니다. 계약 확장 패키지에는 구현 및 종속성이 포함되어 있지 않으므로 특정 계약에 대한 대체 구현을 쉽게 코딩할 수 있으므로 캐시 코드를 수정하지 않고도 캐시된 구현을 대체할 수 있습니다.
Simple
라라벨의 모든 서비스가 간단한 인터페이스로 깔끔하게 정의되어 있으면 해당 서비스가 제공하는 기능을 쉽게 판단할 수 있습니다. 계약서는 프레임워크 기능을 간략하게 설명하는 문서 역할을 합니다.
또한 간단한 인터페이스를 사용하면 코드를 이해하고 유지 관리하기가 더 쉽습니다. 크고 복잡한 클래스에서 어떤 메서드를 사용할 수 있는지 추적하는 대신 간단하고 깔끔한 인터페이스를 참조할 수 있습니다.
계약 사용 방법
그럼 계약을 어떻게 구현하나요? 실제로는 매우 간단합니다.
Laravel의 다양한 유형의 클래스는 컨트롤러, 이벤트 리스너, 미들웨어, 대기열 작업, 심지어 라우팅 폐쇄 등을 포함한 서비스 컨테이너를 통해 해결됩니다. 그런 다음 계약 구현을 얻으려면 확인할 클래스의 생성자에 "형식 힌트" 인터페이스만 입력하면 됩니다.
예를 들어 다음 이벤트 리스너를 살펴보세요.
<?php namespace App\Listeners; use App\User;use App\Events\OrderWasPlaced; use Illuminate\Contracts\Redis\Factory; class CacheOrderInformation{ /** * Redis 工厂实现。 */ protected $redis; /** * 创建一个新的事件处理器实例。 * * @param Factory $redis * @return void */ public function __construct(Factory $redis) { $this->redis = $redis; } /** * 处理事件。 * * @param OrderWasPlaced $event * @return void */ public function handle(OrderWasPlaced $event) { // } }
이벤트 리스너가 해결되면 서비스 컨테이너는 클래스 생성자의 유형 힌트를 읽고 적절한 값을 주입합니다. 서비스 컨테이너 등록에 대해 자세히 알아보려면 서비스 컨테이너 설명서를 확인하세요.
계약 참조
이 표는 모든 Laravel 계약과 그에 상응하는 외관에 대한 빠른 참조를 제공합니다:
Validator::make()
🎜🎜🎜🎜IlluminateContractsViewEngine🎜🎜🎜 🎜🎜🎜🎜IlluminateContractsViewFactory🎜🎜🎜보기
🎜🎜🎜🎜IlluminateContractsViewView🎜🎜View::make()
🎜🎜🎜🎜🎜本文章首发재 🎜LearnKu.com🎜 网站上。🎜🎜