É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énementDescriptionParamètres
AppInitBit de balise d'initialisation de l'application Aucun
HttpRunDémarrage de l'application tag bit Aucun
HttpEndFin de l'application Bit de balise Instance d'objet de réponse actuelle
LogWriteBit de balise de méthode d'écriture de journalInformations de journal actuellement écrites
LogLevelBit de balise d'écriture de journalUn tableau contenant le type de journal et les informations de journal
RouteLoadedChargement 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_select. < code>selectRappel de pré-requêtefindRappel de pré-requêteafter_update
before_find
after_insertinsertRappel après réussite opérationselect查询前回调
before_findfind查询前回调
after_insertinsert操作成功后回调
after_updateupdate操作成功后回调
after_deletedelete

updateRappel après une opération réussie

after_delete

deleteRappel 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 : after_insertbefore_updateafter_updatebefore_writeafter_writebefore_deleteafter_delete
Avant d'ajouter
Après avoir ajouté
before_update
après mise à jour
before_write
after_write
avant suppression
Après suppression