event 이벤트 처리

webman/event는 코드에 침해하지 않고 일부 비즈니스 논리를 수행할 수 있는 정교한 이벤트 메커니즘을 제공합니다. 이는 비즈니스 모듈 간의 디커플링을 구현합니다. 전형적인 시나리오는 새로운 사용자가 성공적으로 등록될 때, user.register와 같은 사용자 정의 이벤트를 발행하면 각 모듈이 해당 이벤트를 수신하여 관련 비즈니스 논리를 실행하는 것입니다.

설치

composer require webman/event

이벤트 구독

이벤트 구독은 config/event.php 파일을 통해 통일성 있게 구성합니다.

<?php
return [
    'user.register' => [
        [app\event\User::class, 'register'],
        // ...기타 이벤트 처리 함수...
    ],
    'user.logout' => [
        [app\event\User::class, 'logout'],
        // ...기타 이벤트 처리 함수...
    ]
];

설명:

  • user.register, user.logout 등은 이벤트 이름으로 문자열 타입이며, 소문자 단어를 사용하고 점(.)으로 구분하는 것이 좋습니다.
  • 하나의 이벤트는 여러 이벤트 처리 함수를 가질 수 있으며, 호출 순서는 구성 순서에 따릅니다.

이벤트 처리 함수

이벤트 처리 함수는 임의의 클래스 메서드, 함수, 클로저 함수 등이 될 수 있습니다.
예를 들어 이벤트 처리 클래스를 생성합니다 app/event/User.php (디렉토리가 존재하지 않는 경우 직접 생성하세요).

<?php
namespace app\event;
class User
{
    function register($user)
    {
        var_export($user);
    }

    function logout($user)
    {
        var_export($user);
    }
}

이벤트 발행

이벤트를 발행하려면 Event::dispatch($event_name, $data); 또는 Event::emit($event_name, $data);를 사용합니다. 예를 들어:

<?php
namespace app\controller;
use support\Request;
use Webman\Event\Event;
class User
{
    public function register(Request $request)
    {
        $user = [
            'name' => 'webman',
            'age' => 2
        ];
        Event::dispatch('user.register', $user);
    }
}

이벤트 발행에 사용되는 두 함수는 Event::dispatch($event_name, $data);Event::emit($event_name, $data);이며, 두 개의 매개변수는 같습니다.
차이점은 emit은 내부에서 자동으로 예외를 포착한다는 것입니다. 즉, 하나의 이벤트에 여러 처리 함수가 있을 경우, 특정 처리 함수에서 예외가 발생하더라도 다른 처리 함수의 실행에는 영향을 미치지 않습니다.
반면 dispatch는 내부에서 자동으로 예외를 포착하지 않으며, 현재 이벤트의 어떤 처리 함수에서 예외가 발생하면 다음 처리 함수의 실행을 중단하고 직접 상위로 예외를 던집니다.

提示
매개변수 $data는 배열, 클래스 인스턴스, 문자열 등 임의의 데이터일 수 있습니다.

와일드카드 이벤트 리스닝

와일드카드 등록 리스닝을 통해 동일한 리스너에서 여러 이벤트를 처리할 수 있습니다. 예를 들어 config/event.php에서 아래와 같이 구성할 수 있습니다.

<?php
return [
    'user.*' => [
        [app\event\User::class, 'deal']
    ],
];

이벤트 처리 함수의 두 번째 매개변수 $event_data를 통해 구체적인 이벤트 이름을 얻을 수 있습니다.

<?php
namespace app\event;
class User
{
    function deal($user, $event_name)
    {
        echo $event_name; // 구체적인 이벤트 이름 예: user.register, user.logout 등
        var_export($user);
    }
}

이벤트 방송 중지

이벤트 처리 함수에서 false를 반환하면 해당 이벤트의 방송이 중지됩니다.

클로저 함수 처리 이벤트

이벤트 처리 함수는 클래스 메서드일 수도 있고 클로저 함수일 수도 있습니다. 예를 들어:

<?php
return [
    'user.login' => [
        function($user){
            var_dump($user);
        }
    ]
];

이벤트 및 리스너 확인

명령어 php webman event:list를 사용하여 프로젝트에 구성된 모든 이벤트 및 리스너를 확인할 수 있습니다.

지원 범위

주 프로젝트의 기본 플러그인애플리케이션 플러그인 역시 event.php 구성을 지원합니다.
기본 플러그인 구성 파일 config/plugin/플러그인_제작사/플러그인_이름/event.php
애플리케이션 플러그인 구성 파일 plugin/플러그인_이름/config/event.php

주의 사항

event 이벤트 처리는 비동기적이지 않으며, event는 느린 비즈니스 처리를 위한 것이 아닙니다. 느린 비즈니스는 메시지 큐를 사용하여 처리해야 합니다. 예: webman/redis-queue