Heim >PHP-Framework >Denken Sie an PHP >ThinkPHP6.0: Ereignissystem und Verwendung von Abfrageereignissen und Modellereignissen

ThinkPHP6.0: Ereignissystem und Verwendung von Abfrageereignissen und Modellereignissen

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼nach vorne
2019-12-16 14:19:155620Durchsuche

ThinkPHP6.0: Ereignissystem und Verwendung von Abfrageereignissen und Modellereignissen

In der neuesten Version 6.0 wurde ein neues Ereignissystem eingeführt, das das Verhalten von Version 5.1 ersetzt und auch Datenbankereignisse und Modellereignisse übernimmt.

Dieser Artikel beschreibt hauptsächlich die neue Version des Ereignissystems und die Verwendung von Abfrageereignissen und Modellereignissen.

Ereignisse definieren

Alle Operationen des Ereignissystems werden statisch über die thinkfacadeEvent-Klasse aufgerufen

Das Ereignissystem verwendet Beobachter Muster bieten eine bessere Möglichkeit, Anwendungen zu entkoppeln. Wenn Sie auf Ereignisse warten müssen, fügen Sie den folgenden Code hinzu:

Event::trigger('UserLogin');

oder verwenden Sie die Hilfsfunktion

event('UserLogin');

Hier stellt UserLogin eine Ereigniskennung dar. Wenn Sie eine separate Ereignisklasse definieren, können Sie diese verwenden Neben dem Namen der Ereignisklasse können Sie sogar eine Ereignisklasseninstanz übergeben.

event('app\event\UserLogin');

Die Ereignisklasse kann schnell über die Befehlszeile generiert werden.

php think make:event UserLogin

Standardmäßig wird eine appeventUserLogin-Ereignisklasse generiert, oder Sie können den vollständigen Klassennamen angeben, um sie zu generieren.

Wir können Methoden zu Ereignisklassen hinzufügen

namespace app\event;
use app\model\User;
class UserLogin
{
    public $user;
    public function __construct(User $user)
    {
        $this->user = $user;
    }
}

Allgemeine Ereignisklassen müssen keine anderen Klassen erben.

Sie können einen Ereignisbezeichner

Event::bind('UserLogin', 'app\event\UserLogin');

an die Ereignisklasse binden oder ihn stapelweise in der Ereignisdefinitionsdatei event.php der Anwendung binden.

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

Wenn Sie keine Ereignisklasse definieren, ist keine Bindung erforderlich.

Das Ereignissystem von ThinkPHP basiert nicht auf Ereignisklassen. Wenn keine zusätzlichen Anforderungen bestehen, kann es nur durch Ereignisidentifizierung verwendet werden.

Sie können einen Ereignisparameter in der Ereignismethode übergeben

event('UserLogin', $user);

Ereignis-Listener

Sie können einen Ereignis-Listener manuell registrieren

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

Oder verwenden Sie die Listening-Klasse

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

, um schnell eine Ereignis-Listening-Klasse über die Befehlszeile zu generieren.

php think make:listener UserLogin

generiert standardmäßig eine applistenerUserLogin-Ereignis-Listening-Klasse, oder Sie können die vollständige Klasse angeben Name, der generiert werden soll.

Die Event-Listening-Klasse muss lediglich eine Handler-Methode definieren und unterstützt die Abhängigkeitsinjektion.

<?php
namespace app\listener;
class UserLogin
{
    public function handle($user)
    {
        // 事件监听处理
    }   
}

Wenn in der Handler-Methode false zurückgegeben wird, bedeutet dies, dass die Überwachung beendet ist und die Überwachung nach dem Ereignis nicht mehr ausgeführt wird.

Generell wird empfohlen, die Überwachung des entsprechenden Ereignisses direkt in der Ereignisdefinitionsdatei zu definieren.

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

Ereignisabonnement

Sie können mehrere Ereignisse in einem Listener über den Ereignisabonnementmechanismus abhören, z. B. durch Generieren einer Ereignisabonnentenklasse über die Befehlszeile,

php think make:subscribe User

Die appsubscribeUser-Klasse wird standardmäßig generiert, oder Sie können den vollständigen zu generierenden Klassennamen angeben.

Dann können Sie Abhörmethoden für verschiedene Ereignisse in der Ereignisabonnementklasse hinzufügen, zum Beispiel:

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

Die Benennungskonvention für Methoden zum Abhören von Ereignissen lautet on+Ereigniskennung (Benennung in Kamelfällen). , und registrieren Sie dann das Ereignisabonnement

Event::subscribe(&#39;app\subscribe\User&#39;);

Es wird allgemein empfohlen,

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;,
        // 更多事件订阅
    ],
];

integrierte Ereignisse zu definieren

Zu den integrierten Systemereignissen gehören:

ThinkPHP6.0: Ereignissystem und Verwendung von Abfrageereignissen und Modellereignissen

Die AppInit-Ereignisdefinition muss in der globalen Ereignisdefinitionsdatei definiert werden, und andere Ereignisse können in der Ereignisdefinitionsdatei der Anwendung definiert werden.

Einige der ursprünglichen Verhaltens-Tags in 5.1 wurden aufgegeben und alle gelöschten Tags können durch bessere Middleware ersetzt werden. Unter Middleware versteht man spezielle Ereignisse im Zusammenhang mit der Verarbeitung von Anfragen und der Reaktion auf Ausgaben. Tatsächlich verfügt die Handle-Methode der Middleware nur über spezielle Parameter und Rückgabewerte.

Abfrageereignis

Rückrufe für Datenbankoperationen werden auch als Abfrageereignisse bezeichnet. Sie umfassen hauptsächlich:

ThinkPHP6.0: Ereignissystem und Verwendung von Abfrageereignissen und Modellereignissen

Verwenden Sie die folgende Methode, um Datenbankabfrageereignisse zu registrieren

\think\facade\Db::event(&#39;before_select&#39;, function ($query) {
    // 事件处理
    return $result;
});

Dasselbe Abfrageereignis kann mehrere Antwortausführungen registrieren. Abfrageereignisse wurden in der neuen Version auch vom Ereignissystem übernommen. Wenn Sie also einen Before_select-Abfrageereignis-Listener registrieren, registriert die unterste Ebene tatsächlich einen Listener für das als db.before_select identifizierte Ereignis.

Das Abfrageereignis hat nur einen Methodenparameter: das aktuelle Abfrageobjekt. Sie können jedoch durch Abhängigkeitsinjektion zusätzliche Parameter hinzufügen.

Modellereignisse

Modellereignisse beziehen sich auf das Betriebsverhalten, das beim Abfragen und Schreiben des Modells ausgelöst wird.

Modellereignisse werden nur wirksam, wenn die Modellmethode aufgerufen wird, und der Abfrage-Builder-Vorgang ist ungültig.

Das Modell unterstützt die folgenden Ereignisse:

ThinkPHP6.0: Ereignissystem und Verwendung von Abfrageereignissen und Modellereignissen

Die registrierte Rückrufmethode unterstützt die Übergabe eines Parameters (aktuelle Modellobjektinstanz), unterstützt jedoch Abhängigkeiten Injektionsmethode zum Hinzufügen zusätzlicher Parameter.

Wenn die Ereignismethoden before_write, before_insert, before_update, before_delete false zurückgeben oder eine thinkException auslösen

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

Das obige ist der detaillierte Inhalt vonThinkPHP6.0: Ereignissystem und Verwendung von Abfrageereignissen und Modellereignissen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:thinkphp.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen