Maison cadre php Laravel Parlons de la façon d'utiliser les événements de modèle dans Laravel

Parlons de la façon d'utiliser les événements de modèle dans Laravel

Dec 22, 2022 pm 09:42 PM
php laravel

Parlons de la façon d'utiliser les événements de modèle dans Laravel

Lorsque vous travaillez avec des modèles Eloquent, il est courant de profiter des événements répartis tout au long du cycle de vie du modèle. Il existe différentes manières de procéder, et dans ce didacticiel, je vais les aborder et expliquer les avantages et les inconvénients de chacune. [Recommandation associée : Tutoriel vidéo laravel]

J'utiliserai le même exemple pour chaque méthode afin que vous puissiez comparer directement. Cet exemple attribue la propriété UUID du modèle à l'UUID lors de la création du modèle lui-même.

Notre première approche utilise la méthode bootstrap statique du modèle pour enregistrer le comportement. Cela nous permet de travailler directement sur le modèle et de le créer lors de la création du modèle.

declare(strict_types=1);

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class Office extends Model
{
    public static function boot(): void
    {
        static::creating(fn (Model $model) =>
            $model->uuid = Str::uuid(),
        );
    }
}
Copier après la connexion

Cette approche est idéale pour les petites réactions directes aux événements du modèle, comme l'ajout d'UUID, car elle est très facile à comprendre et vous pouvez voir exactement ce qui se passe sur le modèle. Le plus gros problème de cette approche est la duplication de code. Si vous avez plusieurs modèles auxquels des UUID doivent être attribués, vous ferez la même chose à plusieurs reprises.

Cela nous amène bien à la deuxième approche, utilisant une fonctionnalité. Dans Laravel, si vous créez une méthode sur un trait qui commence par boot et se termine par le nom du trait, vos modèles peuvent hériter du trait et les démarrer automatiquement. Voici un exemple : boot 开头并以 trait 名称结尾的方法,你的模型可以继承 trait 并自动启动它们。这是一个例子:

declare(strict_types=1);

namespace App\Models\Concerns;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

trait HasUuid
{
    public static function bootHasUuid(): void
    {
        static::creating(fn (Model $model) =>
            $model->uuid = Str::uuid(),
        );
    }
}
Copier après la connexion

使用特征允许你将此行为添加到需要它且易于实现的每个模型中。我最大的缺点是,当多个特征想要利用同一个模型事件时,堆叠这些行为可能会导致问题。他们开始争夺优先权,很快就会变得一团糟。

这将我们引向下一个选项,模型观察者。模型观察者是一种基于类的方法来响应模型事件,其中方法对应于被触发的特定事件。

declare(strict_types=1);

namespace App\Observers;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class OfficeObserver
{
    public function creating(Model $model): void
    {
        $model->uuid = Str::uuid();
    }
}
Copier après la connexion

这个类需要在某个地方注册,在服务提供者或模型本身(这是我推荐的地方)。在模型中注册这个观察者可以在模型级别上看到改变雄辩行为的副作用。将其隐藏在服务提供商中的问题在于,除非每个人都知道它的存在,否则很难知道。这种方法的最大缺点是它的可见性。在我看来,正确使用这种方法非常棒。

解决此问题的另一种方法是利用 Eloquent 模型本身的$dispatchesEvents 属性。这是每个 Eloquent 模型上的一个属性,它允许你列出要侦听的事件以及为这些事件调用的类。

declare(strict_types=1);

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class Office extends Model
{
    protected $dispatchesEvents = [
        'creating' => SetModelUuid::class,
    ];
}
Copier après la connexion

SetModelUuid

declare(strict_types=1);

namespace App\Models\Events;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class SetModelUuid
{
    public function __construct(Model $model)
    {
        $model->uuid = Str::uuid();
    }
}
Copier après la connexion

Utiliser un trait vous permet d'ajouter ce comportement à chaque modèle qui en a besoin et est facile à mettre en œuvre. Mon plus gros inconvénient est que l'empilement de ces comportements peut poser des problèmes lorsque plusieurs fonctionnalités souhaitent tirer parti du même événement de modèle. Ils commencent à se battre pour la priorité et cela devient vite un désastre.

Cela nous amène à l’option suivante, les observateurs modèles. Un observateur de modèle est un moyen basé sur une classe de répondre aux événements du modèle, où la méthode correspond à l'événement spécifique qui a été déclenché.

declare(strict_types=1);

namespace App\Models\Pipelines;

use App\Models\Office

class OfficeCreatingPipeline
{
    public function __construct(Office $model)
    {
        app(Pipeline::class)
            ->send($model)
            ->through([
                ApplyUuidProperty::class,
                TapCreatedBy::class,
            ]);
    }
}
Copier après la connexion
Ce cours doit être inscrit quelque part, soit auprès du prestataire, soit auprès du modèle lui-même (c'est là que je le recommande). L'enregistrement de cet observateur dans le modèle vous permet de voir les effets secondaires d'un changement de comportement éloquent au niveau du modèle. Le problème de le cacher au fournisseur de services est qu'il est difficile de le savoir à moins que tout le monde sache qu'il existe. Le plus gros inconvénient de cette approche est sa visibilité. À mon avis, cette méthode est excellente lorsqu’elle est utilisée correctement.

Une autre façon de résoudre ce problème est de profiter de l'attribut $dispatchesEvents du modèle Eloquent lui-même. Il s'agit d'une propriété sur chaque modèle Eloquent qui vous permet de lister les événements à écouter et les classes à appeler pour ces événements.

rrreee

SetModelUuid sera instancié pendant le cycle de vie du modèle Eloquent, ce qui est votre opportunité d'ajouter des comportements et des propriétés au modèle.

rrreee

Cette approche est l'une des plus claires et des plus faciles à comprendre car le modèle a beaucoup de visibilité et vous pouvez facilement partager cette classe entre les modèles. La plus grande question à laquelle vous serez confronté est de savoir si vous devez déclencher plusieurs actions sur les événements du modèle.

Quoi qu’il en soit, honnêtement, il n’y a pas de bonne façon de procéder. Vous pouvez choisir l'une des méthodes ci-dessus et elles fonctionneront toutes, mais vous devez choisir la méthode qui fonctionne pour vous et votre cas d'utilisation spécifique. J'aimerais voir plus d'options pour cette fonctionnalité spécifique.

Par exemple, si vous devez ajouter plusieurs propriétés à un modèle sur des événements de modèle, les observateurs sont un bon choix. Cependant, est-ce la meilleure option ? Et si nous utilisions l'attribut dispatch events pour exécuter un pipeline personnalisé pour ce modèle ?

rrreee
Comme vous pouvez le voir, nous pouvons commencer à utiliser des pipelines pour ajouter plusieurs comportements pour la modélisation d'événements. Maintenant, cela n'a pas été testé, donc je ne sais pas à 100 % si c'est possible - mais en tant que concept, cela pourrait ouvrir une manière composable de réagir aux événements du modèle.

Comment gérez-vous les événements modèles dans les projets Laravel ? Dites-le-nous sur Twitter !

🎜Adresse originale : https://laravel-news.com/working-with-laravel-model-events🎜🎜Adresse de traduction : https://learnku.com/laravel/t/71183🎜🎜🎜Plus de programmation liée Pour connaissances, veuillez visiter : 🎜Vidéos de programmation🎜 ! ! 🎜

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!

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

Comment configurer Visual Studio Code (VS Code) pour le développement PHP Comment configurer Visual Studio Code (VS Code) pour le développement PHP Dec 20, 2024 am 11:31 AM

Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c

Comment analysez-vous et traitez-vous HTML / XML dans PHP? Comment analysez-vous et traitez-vous HTML / XML dans PHP? Feb 07, 2025 am 11:57 AM

Ce tutoriel montre comment traiter efficacement les documents XML à l'aide de PHP. XML (Language de balisage extensible) est un langage de balisage basé sur le texte polyvalent conçu à la fois pour la lisibilité humaine et l'analyse de la machine. Il est couramment utilisé pour le stockage de données et

Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Apr 05, 2025 am 12:04 AM

JWT est une norme ouverte basée sur JSON, utilisée pour transmettre en toute sécurité des informations entre les parties, principalement pour l'authentification de l'identité et l'échange d'informations. 1. JWT se compose de trois parties: en-tête, charge utile et signature. 2. Le principe de travail de JWT comprend trois étapes: la génération de JWT, la vérification de la charge utile JWT et l'analyse. 3. Lorsque vous utilisez JWT pour l'authentification en PHP, JWT peut être généré et vérifié, et les informations sur le rôle et l'autorisation des utilisateurs peuvent être incluses dans l'utilisation avancée. 4. Les erreurs courantes incluent une défaillance de vérification de signature, l'expiration des jetons et la charge utile surdimensionnée. Les compétences de débogage incluent l'utilisation des outils de débogage et de l'exploitation forestière. 5. L'optimisation des performances et les meilleures pratiques incluent l'utilisation des algorithmes de signature appropriés, la définition des périodes de validité raisonnablement,

Programme PHP pour compter les voyelles dans une chaîne Programme PHP pour compter les voyelles dans une chaîne Feb 07, 2025 pm 12:12 PM

Une chaîne est une séquence de caractères, y compris des lettres, des nombres et des symboles. Ce tutoriel apprendra à calculer le nombre de voyelles dans une chaîne donnée en PHP en utilisant différentes méthodes. Les voyelles en anglais sont a, e, i, o, u, et elles peuvent être en majuscules ou en minuscules. Qu'est-ce qu'une voyelle? Les voyelles sont des caractères alphabétiques qui représentent une prononciation spécifique. Il y a cinq voyelles en anglais, y compris les majuscules et les minuscules: a, e, i, o, u Exemple 1 Entrée: String = "TutorialSpoint" Sortie: 6 expliquer Les voyelles dans la chaîne "TutorialSpoint" sont u, o, i, a, o, i. Il y a 6 yuans au total

Expliquez la liaison statique tardive en PHP (statique: :). Expliquez la liaison statique tardive en PHP (statique: :). Apr 03, 2025 am 12:04 AM

Liaison statique (statique: :) ​​implémente la liaison statique tardive (LSB) dans PHP, permettant à des classes d'appel d'être référencées dans des contextes statiques plutôt que de définir des classes. 1) Le processus d'analyse est effectué au moment de l'exécution, 2) Recherchez la classe d'appel dans la relation de succession, 3) il peut apporter des frais généraux de performance.

Quelles sont les méthodes PHP Magic (__construct, __ destruct, __ call, __get, __set, etc.) et fournir des cas d'utilisation? Quelles sont les méthodes PHP Magic (__construct, __ destruct, __ call, __get, __set, etc.) et fournir des cas d'utilisation? Apr 03, 2025 am 12:03 AM

Quelles sont les méthodes magiques de PHP? Les méthodes magiques de PHP incluent: 1. \ _ \ _ Construct, utilisé pour initialiser les objets; 2. \ _ \ _ Destruct, utilisé pour nettoyer les ressources; 3. \ _ \ _ Appel, gérer les appels de méthode inexistants; 4. \ _ \ _ GET, Implémentez l'accès à l'attribut dynamique; 5. \ _ \ _ SET, Implémentez les paramètres d'attribut dynamique. Ces méthodes sont automatiquement appelées dans certaines situations, améliorant la flexibilité et l'efficacité du code.

Comment obtenir le code de retour lorsque l'envoi par e-mail échoue à Laravel? Comment obtenir le code de retour lorsque l'envoi par e-mail échoue à Laravel? Apr 01, 2025 pm 02:45 PM

Méthode pour obtenir le code de retour lorsque l'envoi par e-mail de Laravel échoue. Lorsque vous utilisez Laravel pour développer des applications, vous rencontrez souvent des situations où vous devez envoyer des codes de vérification. Et en réalité ...

See all articles