ThinkPHP6.0: 이벤트 시스템과 쿼리 이벤트 및 모델 이벤트의 사용

爱喝马黛茶的安东尼
풀어 주다: 2019-12-16 14:19:15
앞으로
5494명이 탐색했습니다.

ThinkPHP6.0: 이벤트 시스템과 쿼리 이벤트 및 모델 이벤트의 사용

최신 버전 6.0에서는 버전 5.1의 동작을 대체하기 위해 새로운 이벤트 시스템이 도입되었으며 데이터베이스 이벤트 및 모델 이벤트도 인수했습니다.

이 글에서는 주로 새 버전의 이벤트 시스템과 쿼리 이벤트 및 모델 이벤트의 사용에 대해 설명합니다.

이벤트 정의

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

이벤트 시스템은 관찰자 패턴을 사용하여 애플리케이션을 분리하는 더 나은 방법을 제공합니다. 이벤트를 수신해야 하는 경우 다음 코드를 추가하세요.

Event::trigger('UserLogin');
로그인 후 복사

또는 도우미 함수

event('UserLogin');
로그인 후 복사

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

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::bind('UserLogin', 'app\event\UserLogin');
로그인 후 복사

를 이벤트 클래스에 바인딩하거나 애플리케이션의 event.php 이벤트 정의 파일에서 일괄적으로 바인딩할 수 있습니다.

return [
    'bind'    =>    [
        'UserLogin' => 'app\event\UserLogin',
        // 更多事件绑定
    ],
];
로그인 후 복사

이벤트 클래스를 정의하지 않으면 바인딩할 필요가 없습니다.

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

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

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)
    {
        // 事件监听处理
    }   
}
로그인 후 복사

핸들러 메소드에 false가 반환되면 모니터링이 종료되며, 이벤트 이후 모니터링은 더 이상 수행되지 않는다는 의미입니다.

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

return [
    &#39;bind&#39;    =>    [
        &#39;UserLogin&#39; => &#39;app\event\UserLogin&#39;,
        // 更多事件绑定
    ],
    &#39;listen&#39;  =>    [
        &#39;UserLogin&#39;    =>    [&#39;\app\listener\UserLogin&#39;],
        // 更多事件监听
    ],
];
로그인 후 복사

이벤트 구독

이벤트 구독 메커니즘을 통해 하나의 리스너에서 여러 이벤트를 들을 수 있습니다. 예를 들어 명령줄을 통해 이벤트 구독자 클래스를 생성하면 appsubscribeUser 클래스가 기본적으로 생성됩니다. 전체 클래스 이름 생성을 지정할 수 있습니다.

그런 다음 이벤트 구독 클래스에 다양한 이벤트에 대한 청취 메소드를 추가할 수 있습니다. 예:

php think make:subscribe User
로그인 후 복사

이벤트를 청취하는 메소드의 명명 규칙은 on+이벤트 식별자(카멜 표기법 명명)이며 이벤트 구독을 등록합니다

<?php
namespace app\subscribe;
class User
{
    public function onUserLogin($user)
    {
        // 事件响应处理
    }
    public function onUserLogout($user)
    {
        // 事件响应处理
    }
}
로그인 후 복사

일반적으로 이벤트

Event::subscribe(&#39;app\subscribe\User&#39;);
로그인 후 복사

내장 이벤트

는 정의 파일에 정의되는 것이 좋습니다. 내장 시스템 이벤트에는 다음이 포함됩니다.

ThinkPHP6.0: 이벤트 시스템과 쿼리 이벤트 및 모델 이벤트의 사용

AppInit 이벤트 정의는 다음 위치에 정의되어야 합니다. 전역 이벤트 정의 파일. 다른 이벤트는 애플리케이션의 이벤트 정의 파일에서 정의할 수 있습니다.

5.1의 원래 동작 태그 중 일부는 폐기되었으며 취소된 모든 태그는 더 나은 미들웨어로 대체될 수 있습니다. 미들웨어는 요청 처리 및 출력 응답과 관련된 특수 이벤트로 생각할 수 있습니다. 실제로 미들웨어의 핸들 메소드에는 특수한 매개변수와 반환값만 있습니다.

쿼리 이벤트

데이터베이스 작업의 콜백은 데이터베이스의 CURD 작업을 위해 설계된 콜백 메서드입니다.

ThinkPHP6.0: 이벤트 시스템과 쿼리 이벤트 및 모델 이벤트의 사용다음 방법을 사용하여 데이터베이스 쿼리 이벤트를 등록하세요.

return [
    &#39;bind&#39;    =>    [
        &#39;UserLogin&#39; => &#39;app\event\UserLogin&#39;,
        // 更多事件绑定
    ],
    &#39;listen&#39;  =>    [
        &#39;UserLogin&#39;    =>    [&#39;\app\listener\UserLogin&#39;],
        // 更多事件监听
    ],
    &#39;subscribe&#39;    =>    [
       &#39;\app\subscribe\User&#39;,
        // 更多事件订阅
    ],
];
로그인 후 복사

Same 쿼리 이벤트는 여러 응답 실행을 등록할 수 있습니다. 쿼리 이벤트도 새 버전의 이벤트 시스템에 의해 인계되었으므로 before_select 쿼리 이벤트 리스너를 등록하면 맨 아래 레이어는 실제로 db.before_select로 식별된 이벤트에 대한 리스너를 등록합니다.

쿼리 이벤트에는 현재 쿼리 객체라는 하나의 메서드 매개변수만 있습니다. 하지만 종속성 주입을 통해 추가 매개변수를 추가할 수 있습니다.

모델 이벤트

모델 이벤트는 모델을 쿼리하고 작성할 때 트리거되는 작업 동작을 나타냅니다.

모델 이벤트는 모델 메서드를 호출할 때만 적용됩니다. 쿼리 생성자 작업을 사용하는 것은 유효하지 않습니다.

모델은 다음 이벤트를 지원합니다.

등록된 콜백 메서드는 하나의 매개변수(현재 모델 객체 인스턴스) 전달을 지원하지만 종속성 주입을 통해 추가 매개변수 추가를 지원합니다. ThinkPHP6.0: 이벤트 시스템과 쿼리 이벤트 및 모델 이벤트의 사용

before_write, before_insert, before_update, before_delete 이벤트 메소드가 false를 반환하거나 thinkException을 발생시키는 경우

ModelEventException异常的话,则不会继续执行后续的操作。

模型事件定义

最简单的方式是在模型类里面定义静态方法来定义模型的相关事件响应。

<?php
namespace app\index\model;
use think\Model;
use app\index\model\Profile;
class User extends Model
{
    public static function onBeforeUpdate($user)
    {
    if (&#39;thinkphp&#39; == $user->name) {
        return false;
        }
    }
    
    public static function onAfterDelete($user)
    {
Profile::destroy($user->id);
    }
}
로그인 후 복사

参数是当前的模型对象实例,支持使用依赖注入传入更多的参数。

模型事件观察者

如果希望模型的事件单独管理,可以给模型注册一个事件观察者,例如:

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
    protected $observerClass = &#39;app\index\observer\User&#39;;
}
로그인 후 복사

User观察者类定义如下:

<?php
namespace app\index\observer;
use app\index\model\Profile;
class User
{
    public function onBeforeUpdate($user)
    {
    if (&#39;thinkphp&#39; == $user->name) {
        return false;
        }
    }
    
    public function onAfterDelete($user)
    {
Profile::destroy($user->id);
    }
}
로그인 후 복사

观察者类的事件响应方法的第一个参数就是模型对象实例,你依然可以通过依赖注入传入其它的对象参数。

PHP中文网,大量的免费ThinkPHP入门教程,欢迎在线学习!

本文转自:https://blog.thinkphp.cn/1037387

위 내용은 ThinkPHP6.0: 이벤트 시스템과 쿼리 이벤트 및 모델 이벤트의 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:thinkphp.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿