programing tip

교리 청취자 대 구독자

itbloger 2020. 10. 30. 07:48
반응형

교리 청취자 대 구독자


저는 Symfony2 프레임 워크에서 작업하고 있으며 언제 Doctrine 구독자를 사용하는지 청취자가 사용하는지 궁금합니다. 청취자를위한 Doctrine의 문서 는 매우 명확하지만 구독자는 다소 광택이 없습니다. Symfony의 요리 책 항목 은 비슷합니다.


내 관점에서 볼 때 주요 차이점은 하나뿐입니다.

  • 리스너는 수신하는 이벤트를 지정하여 등록됩니다.
  • 구독자에는 디스패처에게 수신중인 이벤트를 알려주는 메서드가 있습니다.

이것은 큰 차이처럼 보이지 않을 수도 있지만 생각해 보면 다른 하나를 사용하고 싶은 경우가 있습니다.

  • 등록시 설정되는 이벤트가 다른 여러 디스패처에 하나의 리스너를 할당 할 수 있습니다. 모든 메소드가 리스너에 있는지 확인하기 만하면됩니다.
  • 구독자가 등록 된 이벤트를 런타임에 변경할 수 있으며, 구독자를 등록한 후에도 반환 값을 변경하여 변경할 수 있습니다 getSubscribedEvents(매우 시끄러운 이벤트를 듣고 한 번만 실행하려는 시간을 생각해보십시오).

내가 알지 못하는 다른 차이점이있을 수 있습니다!


우연인지 고의인지 알 수 없습니다.하지만 구독자는 리스너보다 우선 순위가 높습니다-https: //github.com/symfony/symfony/blob/master/src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass .php # L73-L98

교리 측면에서는 그것이 무엇인지 (수신자 또는 구독자) 상관하지 않으며 결국 둘 다 리스너로 등록됩니다-https: //github.com/doctrine/common/blob/master/lib/Doctrine/Common/EventManager.php # L137-L140

이것이 내가 발견 한 것입니다.


symfony2 문서 페이지 기사 에서와 같이 한 클래스에서 여러 이벤트를 처리하려면 이벤트 구독자를 사용해야합니다., 이벤트 리스너는 하나의 이벤트 만 관리 할 수 ​​있지만 하나의 엔티티, prePersist, preUpdate, postPersist 등에 대해 여러 이벤트를 처리하려는 경우 이벤트 리스너를 사용하는 경우 여러 이벤트 리스너를 코딩해야합니다. 이벤트 구독자와 함께 가면 이벤트 구독자를 하나의 클래스로 코딩해야합니다. 이벤트 구독자를 사용하면 한 클래스에서 둘 이상의 이벤트를 관리 할 수 ​​있습니다. 그게 제가 사용하는 방식입니다. 모델 비즈니스에 필요한 것에 초점을 맞춘 코드에 대한 한 가지 예는 엔티티 그룹에 대해서만 전역 적으로 여러 라이프 사이클 이벤트를 처리하고 상위 클래스를 코딩하고 그 안에 해당 전역 메서드를 정의 할 수 있기를 원할 수 있습니다. 그런 다음 엔터티가 해당 클래스를 상속하도록 만들고 나중에 이벤트 구독자에서 원하는 모든 이벤트를 구독하고 prePersist,preUpdate, postPersist 등 ... 그런 다음 해당 부모 클래스를 요청하고 해당 전역 메서드를 실행합니다.


둘 다 특정 이벤트 사전 / 사후 지속 등에서 무언가를 실행할 수 있습니다.

그러나 리스너는 엔티티 내에 캡슐화 된 동작을 실행할 수만 있습니다. 예를 들어 "date_edited"타임 스탬프를 업데이트 할 수 있습니다.

엔티티의 컨텍스트 외부로 이동해야하는 경우 구독자가 필요합니다. 좋은 예는 외부 API를 호출하거나 엔터티와 직접 관련이없는 데이터를 사용 / 검사해야하는 경우입니다.


또 다른 중요한 사항 : Doctrine EventSubscribers는 우선 순위를 설정할 수 없습니다.

여기 에서이 문제에 대해 자세히 알아보세요.


다음은 4.1에서 문서가 말하는 내용입니다. 이것은 전 세계적으로 이벤트에 적용되므로 Doctrine에도 유효하다고 생각합니다 (100 % 확실하지 않음).

청취자 또는 구독자

리스너와 구독자는 동일한 애플리케이션에서 명확하게 사용될 수 있습니다. 둘 중 하나를 사용하기로 결정하는 것은 일반적으로 개인적인 취향의 문제입니다. 그러나 각각에 대해 몇 가지 사소한 이점이 있습니다.

  • 구독자는 이벤트에 대한 지식이 서비스 정의가 아닌 클래스에 유지되기 때문에 재사용하기가 더 쉽습니다. 이것이 Symfony가 내부적으로 가입자를 사용하는 이유입니다.
  • 리스너는 일부 구성 값에 따라 조건부로 번들을 사용하거나 사용하지 않도록 설정할 수 있기 때문에 더 유연합니다.

http://symfony.com/doc/master/event_dispatcher.html#listeners-or-subscribers


문서에서 :

이벤트를 수신하는 가장 일반적인 방법은 디스패처에 이벤트 리스너를 등록하는 것입니다. 이 리스너는 하나 이상의 이벤트를 수신 할 수 있으며 해당 이벤트가 전달 될 때마다 알림을받습니다.

이벤트를 수신하는 또 다른 방법은 이벤트 구독자를 사용하는 것입니다. 이벤트 구독자는 구독해야하는 이벤트를 디스패처에게 정확히 알려줄 수있는 PHP 클래스입니다. getSubscribedEvents ()라는 단일 정적 메서드가 필요한 EventSubscriberInterface 인터페이스를 구현합니다.

여기에서 예를 참조하십시오.

https://symfony.com/doc/3.3/components/event_dispatcher.html

참고 URL : https://stackoverflow.com/questions/10730377/doctrine-listener-versus-subscriber

반응형