Dans la dernière version 6.0, un nouveau système d'événements a été introduit pour remplacer le comportement de la version 5.1, et a également repris les événements de base de données et les événements de modèle.
Cet article décrit principalement la nouvelle version du système d'événements et l'utilisation des événements de requête et des événements de modèle.
Définir des événements
Toutes les opérations du système d'événements sont appelées statiquement via la classe thinkfacadeEvent
Le système d'événements utilise des observateurs Les modèles offrent un meilleur moyen de découpler les applications. Lorsque vous devez écouter des événements, ajoutez le code suivant :
Event::trigger('UserLogin');
ou utilisez la fonction d'assistance
event('UserLogin');
Ici, UserLogin représente un identifiant d'événement. Si vous définissez une classe d'événement distincte, vous pouvez utiliser. le nom de la classe d'événement, vous pouvez même transmettre une instance de classe d'événement.
event('app\event\UserLogin');
La classe d'événements peut être générée rapidement via la ligne de commande
php think make:event UserLogin
Par défaut, une classe d'événements appeventUserLogin sera générée, ou vous pouvez spécifier le nom complet de la classe pour la générer.
Nous pouvons ajouter des méthodes aux classes d'événements
namespace app\event; use app\model\User; class UserLogin { public $user; public function __construct(User $user) { $this->user = $user; } }
Les classes d'événements générales n'ont pas besoin d'hériter d'autres classes.
Vous pouvez lier un identifiant d'événement
Event::bind('UserLogin', 'app\event\UserLogin');
à la classe d'événement ou le lier par lots dans le fichier de définition d'événement event.php de l'application.
return [ 'bind' => [ 'UserLogin' => 'app\event\UserLogin', // 更多事件绑定 ], ];
Si vous ne définissez pas de classe d'événement, aucune liaison n'est requise.
Le système d'événements de ThinkPHP ne repose pas sur des classes d'événements. S'il n'y a pas d'exigences supplémentaires, il ne peut être utilisé que via l'identification d'événements.
Vous pouvez transmettre un paramètre d'événement dans la méthode événementielle
event('UserLogin', $user);
Écouteur d'événement
Vous pouvez enregistrer manuellement un écouteur d'événement
Event::listen('UserLogin', function($user) { // });
Ou utilisez la classe d'écoute
Event::listen('UserLogin', 'app\listener\UserLogin');
pour générer rapidement une classe d'écoute d'événements via la ligne de commande
php think make:listener UserLogin
générera une classe d'écoute d'événements applistenerUserLogin par défaut, ou vous pouvez spécifier la classe complète. nom à générer.
La classe d'écoute d'événements doit uniquement définir une méthode de gestionnaire et prend en charge l'injection de dépendances.
<?php namespace app\listener; class UserLogin { public function handle($user) { // 事件监听处理 } }
Si false est renvoyé dans la méthode du gestionnaire, cela signifie que la surveillance est terminée et que la surveillance après l'événement ne sera plus exécutée.
Il est généralement recommandé de définir la surveillance de l'événement correspondant directement dans le fichier de définition de l'événement.
return [ 'bind' => [ 'UserLogin' => 'app\event\UserLogin', // 更多事件绑定 ], 'listen' => [ 'UserLogin' => ['\app\listener\UserLogin'], // 更多事件监听 ], ];
Abonnement aux événements
Vous pouvez écouter plusieurs événements dans un seul écouteur via le mécanisme d'abonnement aux événements, par exemple en générant une classe d'abonné aux événements via la ligne de commande,
php think make:subscribe User
La classe appsubscribeUser sera générée par défaut, ou vous pouvez spécifier le nom complet de la classe à générer.
Ensuite, vous pouvez ajouter des méthodes d'écoute pour différents événements dans la classe d'abonnement aux événements, par exemple :
<?php namespace app\subscribe; class User { public function onUserLogin($user) { // 事件响应处理 } public function onUserLogout($user) { // 事件响应处理 } }
La convention de dénomination des méthodes d'écoute des événements est on+event identifier (nommage de cas de chameau) , puis enregistrez l'abonnement à l'événement
Event::subscribe('app\subscribe\User');
Il est généralement recommandé de définir
return [ 'bind' => [ 'UserLogin' => 'app\event\UserLogin', // 更多事件绑定 ], 'listen' => [ 'UserLogin' => ['\app\listener\UserLogin'], // 更多事件监听 ], 'subscribe' => [ '\app\subscribe\User', // 更多事件订阅 ], ];
Événements intégrés
Les événements système intégrés incluent :
La définition d'événement AppInit doit être définie dans le fichier de définition d'événement global, et d'autres événements peuvent être définis dans le fichier de définition d'événement de l'application.
Certaines des balises de comportement d'origine de la version 5.1 ont été abandonnées et toutes les balises annulées peuvent être remplacées par un meilleur middleware. Le middleware peut être considéré comme des événements spéciaux liés au traitement des demandes et à la réponse aux résultats. En fait, la méthode handle du middleware n'a que des paramètres spéciaux et des valeurs de retour.
Événement de requête
Les rappels pour les opérations de base de données sont également appelés événements de requête. Ce sont des méthodes de rappel conçues pour les opérations CURD de la base de données. 🎜 >
Utilisez la méthode suivante pour enregistrer les événements de requête de base de données
\think\facade\Db::event('before_select', function ($query) { // 事件处理 return $result; });
Le même événement de requête peut enregistrer plusieurs exécutions de réponses. Les événements de requête ont également été repris par le système d'événements dans la nouvelle version, donc si vous enregistrez un écouteur d'événement de requête before_select, la couche inférieure enregistre en fait un écouteur pour l'événement identifié comme db.before_select.
L'événement de requête n'a qu'un seul paramètre de méthode : l'objet de requête actuel. Mais vous pouvez ajouter des paramètres supplémentaires via l’injection de dépendances.Événements de modèle
Les événements de modèle font référence aux comportements opérationnels déclenchés lors de l'interrogation et de l'écriture du modèle.
Les événements de modèle ne prennent effet que lors de l'appel de la méthode de modèle et l'opération du générateur de requêtes n'est pas valide.Le modèle prend en charge les événements suivants :
La méthode de rappel enregistrée prend en charge la transmission d'un paramètre (instance d'objet de modèle actuelle), mais prend en charge les dépendances. manière d'injection pour ajouter des paramètres supplémentaires.
Si les méthodes d'événement before_write, before_insert, before_update, before_delete renvoient false ou lancent thinkexceptionModelEventException异常的话,则不会继续执行后续的操作。
模型事件定义
最简单的方式是在模型类里面定义静态方法来定义模型的相关事件响应。
<?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
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!