ThinkPHP6.0: Ereignissystem und Verwendung von Abfrageereignissen und Modellereignissen

爱喝马黛茶的安东尼
Freigeben: 2019-12-16 14:19:15
nach vorne
5494 Leute haben es durchsucht

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');
Nach dem Login kopieren

oder verwenden Sie die Hilfsfunktion

event('UserLogin');
Nach dem Login kopieren

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');
Nach dem Login kopieren

Die Ereignisklasse kann schnell über die Befehlszeile generiert werden.

php think make:event UserLogin
Nach dem Login kopieren

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;
    }
}
Nach dem Login kopieren

Allgemeine Ereignisklassen müssen keine anderen Klassen erben.

Sie können einen Ereignisbezeichner

Event::bind('UserLogin', 'app\event\UserLogin');
Nach dem Login kopieren

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

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

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);
Nach dem Login kopieren

Ereignis-Listener

Sie können einen Ereignis-Listener manuell registrieren

Event::listen('UserLogin', function($user) {
    // 
});
Nach dem Login kopieren

Oder verwenden Sie die Listening-Klasse

Event::listen('UserLogin', 'app\listener\UserLogin');
Nach dem Login kopieren

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

php think make:listener UserLogin
Nach dem Login kopieren

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)
    {
        // 事件监听处理
    }   
}
Nach dem Login kopieren

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;],
        // 更多事件监听
    ],
];
Nach dem Login kopieren

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
Nach dem Login kopieren

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)
    {
        // 事件响应处理
    }
}
Nach dem Login kopieren

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;);
Nach dem Login kopieren

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

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;
});
Nach dem Login kopieren

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);
    }
}
Nach dem Login kopieren

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

模型事件观察者

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

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
    protected $observerClass = &#39;app\index\observer\User&#39;;
}
Nach dem Login kopieren

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);
    }
}
Nach dem Login kopieren

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

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!

Verwandte Etiketten:
Quelle:thinkphp.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage