이벤트
이벤트를 정의하는 방법
이벤트 시스템의 모든 작업은 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');
기본 제공 이벤트
를 사용할 수 있습니다. 내장 시스템 이벤트에는 다음이 포함됩니다.
Event | Description | Parameters |
---|---|---|
AppInit | 애플리케이션 초기화 태그 비트 | None |
HttpRun | 애플리케이션 시작 태그 비트 | None |
HttpEnd | 앱 종료 태그 비트 | 커런트 응답 객체 인스턴스 인스턴스 |
logwrite | log 쓰기 메소드 태그 비트로 작성된 로그 정보 | |
log 쓰기 태그 비트 로그 유형 및 로그 정보를 포함하는 배열 | RouteLoaded | |
None | AppInit 이벤트 정의는 전역 이벤트 정의 파일에 정의되어야 하며, 다른 이벤트는 애플리케이션의 이벤트 정의 파일에 정의될 수 있습니다. |
< code>선택사전 쿼리 콜백
찾기
사전 쿼리 콜백
select 查询前回调 | |
before_find | find 查询前回调 |
after_insert | insert 操作成功后回调 |
after_update | update 操作成功后回调 |
after_delete | delete after_delete |
쿼리 이벤트의 매개변수 현재 쿼리 개체 인스턴스입니다.
모델 이벤트에는 다음이 포함됩니다.
hook | 해당 작업 |
---|---|
after_read | after query |
before_insert | 추가 전 |
after_insert | 추가 후 |
업데이트 전 | 업데이트 전 |
업데이트 후 | 업데이트 후 |
before_write | before_write |
after_write | after_write |
before_delete | 삭제 전 |
after_delete | 삭제 후 |