Maison > cadre php > PensezPHP > le corps du texte

ThinkPHP6.0 : système d'événements et utilisation d'événements de requête et d'événements de modèle

爱喝马黛茶的安东尼
Libérer: 2019-12-16 14:19:15
avant
5462 Les gens l'ont consulté

ThinkPHP6.0 : système d'événements et utilisation d'événements de requête et d'événements de modèle

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');
Copier après la connexion

ou utilisez la fonction d'assistance

event('UserLogin');
Copier après la connexion

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');
Copier après la connexion

La classe d'événements peut être générée rapidement via la ligne de commande

php think make:event UserLogin
Copier après la connexion

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;
    }
}
Copier après la connexion

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');
Copier après la connexion

à 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',
        // 更多事件绑定
    ],
];
Copier après la connexion

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);
Copier après la connexion

Écouteur d'événement

Vous pouvez enregistrer manuellement un écouteur d'événement

Event::listen('UserLogin', function($user) {
    // 
});
Copier après la connexion

Ou utilisez la classe d'écoute

Event::listen('UserLogin', 'app\listener\UserLogin');
Copier après la connexion

pour générer rapidement une classe d'écoute d'événements via la ligne de commande

php think make:listener UserLogin
Copier après la connexion

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)
    {
        // 事件监听处理
    }   
}
Copier après la connexion

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 [
    &#39;bind&#39;    =>    [
        &#39;UserLogin&#39; => &#39;app\event\UserLogin&#39;,
        // 更多事件绑定
    ],
    &#39;listen&#39;  =>    [
        &#39;UserLogin&#39;    =>    [&#39;\app\listener\UserLogin&#39;],
        // 更多事件监听
    ],
];
Copier après la connexion

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
Copier après la connexion

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)
    {
        // 事件响应处理
    }
}
Copier après la connexion

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(&#39;app\subscribe\User&#39;);
Copier après la connexion

Il est généralement recommandé de définir

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;,
        // 更多事件订阅
    ],
];
Copier après la connexion

Événements intégrés

Les événements système intégrés incluent :

ThinkPHP6.0 : système dévénements et utilisation dévénements de requête et dévénements de modèle

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. 🎜 >

ThinkPHP6.0 : système dévénements et utilisation dévénements de requête et dévénements de modèleUtilisez la méthode suivante pour enregistrer les événements de requête de base de données

\think\facade\Db::event(&#39;before_select&#39;, function ($query) {
    // 事件处理
    return $result;
});
Copier après la connexion

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 :

ThinkPHP6.0 : système dévénements et utilisation dévénements de requête et dévénements de modèleLa 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 thinkexception

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);
    }
}
Copier après la connexion

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

模型事件观察者

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

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
    protected $observerClass = &#39;app\index\observer\User&#39;;
}
Copier après la connexion

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);
    }
}
Copier après la connexion

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

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!

Étiquettes associées:
source:thinkphp.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!