이벤트


이벤트를 정의하는 방법

이벤트 시스템의 모든 작업은 thinkfacadeEvent 클래스를 통해 정적으로 호출됩니다.

이벤트 시스템은 분리된 애플리케이션을 제공하기 위해 관찰자 패턴(PHP 디자인 패턴 참조)을 사용합니다. 방법.

이벤트를 수신해야 하는 경우, 예를 들어 아래에서는 사용자가 로그인 작업을 완료한 후 다음 이벤트 트리거 코드를 추가합니다.

// 触发UserLogin事件 用于执行用户登录后的一系列操作
Event::trigger('UserLogin');


여기에서 UserLogin은 별도의 이벤트 클래스를 정의하는 경우 이벤트 식별자를 나타냅니다. 이벤트 클래스 이름을 사용할 수 있습니다(이벤트 클래스 인스턴스를 전달할 수도 있음).

// 直接使用事件类触发
event('app\event\UserLogin');

이벤트 클래스는 명령줄을 통해 빠르게 생성할 수 있습니다.

php think make:event UserLogin

appeventUserLogin 이벤트 클래스는 기본적으로 생성되거나 전체 클래스 이름을 지정하여 생성할 수 있습니다.

이벤트 클래스에 메소드를 추가할 수 있습니다

namespace app\event;

use app\model\User;

class UserLogin
{
    public $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }
}

일반 이벤트 클래스는 다른 클래스를 상속할 필요가 없습니다.

이벤트 식별자를 이벤트 클래스에 바인딩할 수 있습니다. 일반적으로 애플리케이션의 event.php 이벤트 정의 파일에서 직접 일괄 바인딩하는 것이 좋습니다.

return [
    'bind'    =>    [
        'UserLogin' => 'app\event\UserLogin',
        // 更多事件绑定
    ],
];

동적 바인딩이 필요한 경우

Event::bind(['UserLogin' => 'app\event\UserLogin']);

ThinkPHP의 이벤트 시스템은 이벤트 클래스에 의존하지 않으며, 추가 요구 사항이 없으면 이벤트 식별을 통해서만 사용할 수 있으므로 이벤트 클래스를 정의하는 수고가 필요하지 않습니다.

이벤트 클래스를 정의하지 않으면 바인딩이 필요하지 않습니다. 대부분의 시나리오에서는 실제로 이벤트 클래스를 정의할 필요가 없을 수도 있습니다.

이벤트 메소드에 이벤트 매개변수를 전달할 수 있습니다

// user是当前登录用户对象实例
event('UserLogin', $user);

이벤트 수신

수동으로 이벤트 리스너를 등록할 수 있습니다

Event::listen('UserLogin', function($user) {
    // 
});

또는 청취 클래스를 사용하여 모니터링을 수행할 수 있습니다

Event::listen('UserLogin', 'app\listener\UserLogin');

빠르게 생성할 수 있습니다 명령줄을 통해 이벤트 수신 클래스

php think make:listener UserLogin

는 기본적으로 applistenerUserLogin 이벤트 수신 클래스를 생성하거나 전체 클래스 이름을 지정하여 생성할 수 있습니다.

이벤트 청취 클래스는 핸들 메소드만 정의하면 되며 종속성 주입을 지원합니다.

<?php
namespace app\listener;

class UserLogin
{
    public function handle($user)
    {
        // 事件监听处理
    }   
}

handle 메소드에 false가 반환되면 모니터링이 종료된다는 의미이며, 이벤트 이후의 모니터링은 더 이상 실행되지 않습니다.

일반적으로 해당 이벤트의 모니터링을 이벤트 정의 파일에서 직접 정의하는 것이 좋습니다.

return [
    'bind'    =>    [
        'UserLogin' => 'app\event\UserLogin',
        // 更多事件绑定
    ],
    'listen'  =>    [
        'UserLogin'    =>    ['app\listener\UserLogin'],
        // 更多事件监听
    ],
];

이벤트 구독

명령줄을 통해 이벤트 구독자 클래스를 생성하는 등 이벤트 구독 메커니즘을 통해 하나의 리스너에서 여러 이벤트를 들을 수 있습니다.

php think make:subscribe User

appsubscribeUser 클래스는 기본적으로 생성됩니다. 전체 클래스 이름 생성을 지정할 수 있습니다.

그런 다음 예를 들어 이벤트 구독 클래스에서 다양한 이벤트에 대한 청취 방법을 추가할 수 있습니다.

<?php
namespace app\subscribe;

class User
{
    public function onUserLogin($user)
    {
        // UserLogin事件响应处理
    }

    public function onUserLogout($user)
    {
        // UserLogout事件响应处理
    }
}

이벤트를 수신하는 메소드의 명명 규칙은 on+이벤트 식별자(카멜 케이스 이름 지정)이며, 이벤트 정의 파일에 이벤트 구독자를 등록합니다.

return [
    'bind'    =>    [
        'UserLogin' => 'app\event\UserLogin',
        // 更多事件绑定
    ],
    'listen'  =>    [
        'UserLogin'    =>    ['app\listener\UserLogin'],
        // 更多事件监听
    ],
    'subscribe'    =>    [
       'app\subscribe\User',
        // 更多事件订阅
    ],
];

이벤트 접두사 식별자를 균일하게 추가하려면 eventPrefix 속성을 정의하면 됩니다.

<?php
namespace app\subscribe;

class User
{
    protected $eventPrefix = 'User';

    public function onLogin($user)
    {
        // UserLogin事件响应处理
    }

    public function onLogout($user)
    {
        // UserLogout事件响应处理
    }
}

구독 방법(또는 방법 사양)을 맞춤설정하려면 구독 방법 구현을 정의하면 됩니다.

<?php
namespace app\subscribe;

use think\Event;

class User
{
    public function onUserLogin($user)
    {
        // UserLogin事件响应处理
    }

    public function onUserLogout($user)
    {
        // UserLogout事件响应处理
    }

    public function subscribe(Event $event)
    {
        $event->listen('UserLogin', [$this,'onUserLogin']);
        $event->listen('UserLogout',[$this,'onUserLogout']);
    }
}

동적으로 등록해야 하는 경우

Event::subscribe('app\index\subscribe\User');

기본 제공 이벤트

를 사용할 수 있습니다. 내장 시스템 이벤트에는 다음이 포함됩니다.


loglevel 경로 로딩 완료AppInit 이벤트 정의는 전역 이벤트 정의 파일에 정의되어야 하며, 다른 이벤트는 애플리케이션의 이벤트 정의 파일에 정의될 수 있습니다. 5.1의 원래 동작 태그 중 일부는 폐기되었으며, 취소된 모든 태그는 미들웨어를 사용하여 더 나은 태그로 대체될 수 있습니다. 미들웨어는 요청 처리 및 출력 응답과 관련된 특수 이벤트로 생각할 수 있습니다. 실제로 미들웨어의 핸들러 메소드에는 특수한 매개변수와 반환값만 있습니다.
EventDescriptionParameters
AppInit애플리케이션 초기화 태그 비트 None
HttpRun애플리케이션 시작 태그 비트 None
HttpEnd앱 종료 태그 비트 커런트 응답 객체 인스턴스 인스턴스
logwritelog 쓰기 메소드 태그 비트로 작성된 로그 정보
log 쓰기 태그 비트 로그 유형 및 로그 정보를 포함하는 배열 RouteLoaded
None

데이터베이스 작업의 콜백은 쿼리 이벤트라고도 합니다. 데이터베이스의 CURD 작업을 위해 설계된 콜백 메서드입니다. 여기에는 주로 다음이 포함됩니다.

< code>선택사전 쿼리 콜백

before_find


찾기사전 쿼리 콜백

after_insert삽입성공 후 콜백 Operationafter_updateupdate작업 성공 후 콜백delete작업 성공 후 콜백
select查询前回调
before_findfind查询前回调
after_insertinsert操作成功后回调
after_updateupdate操作成功后回调
after_deletedeleteafter_delete

쿼리 이벤트의 매개변수 현재 쿼리 개체 인스턴스입니다.

모델 이벤트에는 다음이 포함됩니다.

hook해당 작업
after_readafter query
before_insert 추가 전
after_insert추가 후
업데이트 전업데이트 전
업데이트 후업데이트 후
before_writebefore_write
after_writeafter_write
before_delete삭제 전
after_delete삭제 후