Heim >PHP-Framework >Denken Sie an PHP >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 [ 'bind' => [ 'UserLogin' => 'app\event\UserLogin', // 更多事件绑定 ], 'listen' => [ 'UserLogin' => ['\app\listener\UserLogin'], // 更多事件监听 ], ];
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('app\subscribe\User');
Es wird allgemein empfohlen,
return [ 'bind' => [ 'UserLogin' => 'app\event\UserLogin', // 更多事件绑定 ], 'listen' => [ 'UserLogin' => ['\app\listener\UserLogin'], // 更多事件监听 ], 'subscribe' => [ '\app\subscribe\User', // 更多事件订阅 ], ];
integrierte Ereignisse zu definieren
Zu den integrierten Systemereignissen gehören:
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:
Verwenden Sie die folgende Methode, um Datenbankabfrageereignisse zu registrieren
\think\facade\Db::event('before_select', 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:
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 ('thinkphp' == $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 = 'app\index\observer\User'; }
User观察者类定义如下:
<?php namespace app\index\observer; use app\index\model\Profile; class User { public function onBeforeUpdate($user) { if ('thinkphp' == $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!