Événement
Comment 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 le modèle d'observateur (se référer au modèle de conception PHP) pour fournir des applications découplées. Mieux chemin.
Lorsque vous devez écouter des événements, par exemple, ci-dessous, nous ajoutons le code de déclenchement d'événement suivant une fois que l'utilisateur a terminé l'opération de connexion :
// 触发UserLogin事件 用于执行用户登录后的一系列操作 Event::trigger('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');
Les classes d'événements peuvent être rapidement générées via la ligne de commande
php think make:event UserLogin
Une classe d'événements appeventUserLogin sera générée par défaut, 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 à la classe d'événement. Il est généralement recommandé de le lier par lots directement dans le fichier de définition d'événement event.php de l'application.
return [ 'bind' => [ 'UserLogin' => 'app\event\UserLogin', // 更多事件绑定 ], ];
Si vous avez besoin d'une liaison dynamique, vous pouvez utiliser
Event::bind(['UserLogin' => 'app\event\UserLogin']);
Le système d'événements de ThinkPHP ne repose pas sur les classes d'événements. S'il n'y a pas d'exigences supplémentaires, il peut également être utilisé uniquement via l'identification d'événements, éliminant ainsi les problèmes de définition des classes d'événements.
Si vous ne définissez pas de classe d'événement, aucune liaison n'est requise. Pour la plupart des scénarios, il n’est en effet pas nécessaire de définir une classe d’événements.
Vous pouvez transmettre un paramètre d'événement dans la méthode événementielle
// user是当前登录用户对象实例 event('UserLogin', $user);
Écouter les événements
Vous pouvez enregistrer manuellement un écouteur d'événement
Event::listen('UserLogin', function($user) { // });
ou utiliser une classe d'écoute pour effectuer une surveillance
Event::listen('UserLogin', 'app\listener\UserLogin');
Vous pouvez en générer rapidement un via la ligne de commande La classe d'écoute d'événements
php think make:listener UserLogin
générera une classe d'écoute d'événements applistenerUserLogin par défaut, ou vous pouvez spécifier le nom complet de la classe pour la générer.
La classe d'écoute d'événements n'a besoin que de définir une méthode handle 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 handle, cela signifie que la surveillance est terminée et que la surveillance après l'événement ne sera plus effectuée.
Il est généralement recommandé de définir le suivi 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, générer 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 la génération du nom de classe complet.
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) { // UserLogin事件响应处理 } public function onUserLogout($user) { // UserLogout事件响应处理 } }
La convention de dénomination pour les méthodes qui écoutent les événements est on+event identifier (nommage de cas de chameau), puis enregistrez les abonnés à l'événement dans le fichier de définition d'événement.
return [ 'bind' => [ 'UserLogin' => 'app\event\UserLogin', // 更多事件绑定 ], 'listen' => [ 'UserLogin' => ['app\listener\UserLogin'], // 更多事件监听 ], 'subscribe' => [ 'app\subscribe\User', // 更多事件订阅 ], ];
Si vous souhaitez ajouter des identifiants de préfixe d'événement de manière uniforme, vous pouvez définir l'attribut eventPrefix.
<?php namespace app\subscribe; class User { protected $eventPrefix = 'User'; public function onLogin($user) { // UserLogin事件响应处理 } public function onLogout($user) { // UserLogout事件响应处理 } }
Si vous souhaitez personnaliser la méthode d'abonnement (ou la spécification de la méthode), vous pouvez définir l'implémentation de la méthode d'abonnement.
<?php namespace app\subscribe; use think\Event; class User { public function onUserLogin($user) { // UserLogin事件响应处理 } public function onUserLogout($user) { // UserLogout事件响应处理 } public function subscribe(Event $event) { $event->listen('UserLogin', [$this,'onUserLogin']); $event->listen('UserLogout',[$this,'onUserLogout']); } }
Si vous devez vous inscrire dynamiquement, vous pouvez utiliser
Event::subscribe('app\index\subscribe\User');
événements intégrés
Les événements système intégrés incluent :
Événement | Description | Paramètres |
---|---|---|
AppInit | Bit de balise d'initialisation de l'application | Aucun |
HttpRun | Démarrage de l'application tag bit | Aucun |
HttpEnd | Fin de l'application Bit de balise | Instance d'objet de réponse actuelle |
LogWrite | Bit de balise de méthode d'écriture de journal | Informations de journal actuellement écrites |
LogLevel | Bit de balise d'écriture de journal | Un tableau contenant le type de journal et les informations de journal |
RouteLoaded | Chargement de l'itinéraire terminé | Aucun |
La définition de l'événement AppInit doit être définie dans le fichier de définition d'événement global, d'autres événements peuvent être définis dans le fichier de définition d'événement d'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 de meilleures balises à l'aide d'un 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 de gestion du middleware n'a que des paramètres spéciaux et des valeurs de retour.
Le rappel de l'opération de base de données est également appelé événement de requête. Il s'agit d'une méthode de rappel conçue pour le fonctionnement CURD de la base de données. Elle comprend principalement :
before_find | |
---|---|
after_insert | insert Rappel après réussite opérationselect 查询前回调 |
before_find | find 查询前回调 |
after_insert | insert 操作成功后回调 |
after_update | update 操作成功后回调 |
after_delete | delete |
update
Rappel après une opération réussie
after_delete
delete
Rappel après une opération réussieLe paramètre de l'événement de requête est l'instance actuelle de l'objet de requête . Les événements modèles incluent : | Avant d'ajouter |
---|---|
Après avoir ajouté | |
before_update | |
après mise à jour | |
before_write | |
after_write | |
avant suppression | |
Après suppression | |