애플리케이션 개발 중에 이벤트에 유연하게 대응할 수 있도록 애플리케이션이 필요한 경우가 많습니다. 예를 들어, 특정 작업(예: 사용자 등록)이 발생할 때 여러 시스템에 알리고 싶다고 가정해 보겠습니다. 이것이 바로 패턴 관찰자가 등장하는 곳입니다. 이 패턴을 사용하면 개체 간의 관계를 설정할 수 있으므로 한 개체의 상태가 변경되면 다른 모든 개체에도 자동으로 정보가 전달되고 업데이트됩니다.
Symfony는 프로젝트에 매우 실용적이고 강력하게 사용할 수 있는 Event Dispatcher 덕분에 이미 이 패턴을 효과적으로 구현하고 있습니다.
패턴 관찰자를 사용하면 관찰 대상과 한 명 이상의 관찰자 간의 관계를 정의할 수 있습니다. 관찰된 객체에 상태 변화가 발생하면 모든 관찰자가 그에 따라 반응할 수 있도록 알림을 받습니다.
작동 방식은 다음과 같습니다.
사용자가 등록할 수 있는 사이트가 있다고 가정해 보겠습니다. 등록할 때마다 환영 이메일을 보내고, 사용자를 뉴스레터 목록에 추가하고, 분석 시스템에 알리고 싶습니다.
한 곳에서 모든 것을 엄격하게 코딩하는 대신 "등록된 사용자" 이벤트가 트리거되는 즉시 알림을 받게 되는 여러 관찰자에게 이러한 작업을 위임할 수 있습니다.
Symfony에서는 이벤트 디스패처를 사용하여 패턴 관찰자를 설정합니다. 이렇게 하면 기본 로직을 수정하지 않고도 코드를 깔끔하게 정리하고 확장 가능하게 만들 수 있습니다.
사용자가 등록할 때 전달되는 이벤트를 만드는 것부터 시작하겠습니다. 후자에는 사용자 정보가 포함됩니다.
이제 컨트롤러나 서비스에서 사용자가 등록할 때 이 이벤트를 전달합니다.
다음으로 등록 이벤트가 전달될 때마다 호출되는 관찰자를 생성해야 합니다. 여기에 이메일을 보내고 사용자를 뉴스레터 목록에 추가하는 예가 있습니다.
이제 user.registered 이벤트를 수신할 수 있도록 구성에 리스너를 등록해야 합니다.
config/services.yaml에서 관찰자를 서비스로 추가합니다.
ℹ️ Symfony 버전 5.3부터 PHP 속성을 사용하여 서비스 및 이벤트 리스너를 구성할 수 있습니다. 이는 services.yaml 파일을 사용하는 대신 클래스에서 직접 이벤트를 선언할 수 있는 보다 현대적인 접근 방식입니다.
따라서 리스너 메소드에서 직접 #[AsEventListener] 속성을 사용할 수 있습니다.
속성을 사용하여 두 관찰자를 조정하는 방법을 보여드리겠습니다(그러면 config/services.yaml에 특별한 구성이 필요하지 않습니까? :
RegistrationController에 사용자를 등록하면 이벤트가 전달되고 Symfony는 자동으로 해당 관찰자를 호출합니다. 이메일이 전송되고 이러한 작업/로직이 비즈니스 코드와 혼합되지 않고 사용자가 뉴스레터 목록에 추가됩니다.
필수이니까요! 귀하의 신청서는 다음과 같습니다:
패턴 관찰자는 이벤트가 핵심 요소(도메인 이벤트)인 DDD(도메인 중심 설계) 기반 아키텍처에서 자주 사용됩니다. 이러한 이벤트를 통해 시스템의 다양한 부분이 반응할 수 있으며, 주로 기본 도메인 외부에서 반응할 수 있습니다. 하지만 그것은 DDD에 대한 향후 전체 기사에 대한 토론입니다!
위 내용은 디자인 패턴 관찰자: 강력한 알림 시스템의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!