2017-03-01 3 views
2

PHP에서는 이벤트 구동 형 노드, Node.js 만 사용한 적이 없으므로 이벤트 디스 패칭 시스템이 PHP로 작동하는 방식을 이해하려고합니다 (예 : Laravel events, CakePHP eventsSymfony event dispatcher).PHP 이벤트 전달 시스템 이해하기

이 예는 Laravel의 문서에 아파치에서 실행되는 PHP 스크립트의 수명 이후

protected $listen = [ 
    'App\Events\OrderShipped' => [ 
     'App\Listeners\SendShipmentNotification', 
    ], 
]; 

은 기본적으로 요청의 수명이며,이 청취자는 각 요청 인스턴스화하는 모든 이벤트를 의미합니까?

내 애플리케이션에 120 명의 리스너가있는 경우 (예 : $listen 속성에 나열 됨) 페이지를 방문 할 때마다 120 개의 리스너가 모두 인스턴스화됩니까? 또는 리스너 객체는 적절한 이벤트가 전달 될 때만 인스턴스화됩니까?

요청의 전체 기간 동안 단일 이벤트가 실행되지 않을 수도있는 리스너가 각 요청에 대해 인스턴스화되는 것은 상당히 비효율적 인 것처럼 보입니다.

내가 염려해야 할 부분인가?

+0

개별 이벤트에 대한 오버 헤드가 매우 낮다을 instansiated 않겠다 다음 실행시 my_cool_event_name을 파견하지 않을 경우. – Augwa

+0

120 이벤트 리스너는 엔터프라이즈 급 CRM 또는 ERP 외부에서 약간 높은 것으로 보이지만 디스패처 자체가 이벤트 키를 기반으로 리스너 핸들러의 인스턴스를 제어한다고 생각합니다. 그래서 실제로 그것은 연관을 유지하는 배열이고, 첫 번째 레벨 조건이 충족 될 때 두 번째 수준 연관이 (발송자에 의해) 인스턴스화됩니다. –

답변

2

이벤트 리스너 시스템 작동 방법.

가장 간단한 용어는 단지 텍스트 개체의 배열입니다.

그래서 심포니에서 당신은 다음에서 그래서

$events = [ 
    'my_cool_event_name' => [ 
     'events\notifyController::email', 
     'events\notifyController::text', 
     'events\notifyController::tweet', 
    ], 
    'another_event' => [ 

    ] 
]; 

를 검색 단지 배열을 수행하여 이벤트 my_cool_event_name을 수신하는 것을 찾습니다이

$eventManager->dispatch('my_cool_event_name', $eventPayload); 

이 같은 일을 할 수 위의 배열 예제에서는 my_cool_event_name에서 수신하는 3 개의 이벤트를 발견하면 events\notifyController을 생성하고 각 이벤트에 $eventPayload을 통과하는 메소드를 실행합니다.

는 이벤트가 해당 청취자를 찾아 다음 그것들을 초기화 것이다 발사 할 때 아무것도,