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(), ); } }
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(), ); } }
使用特征允许你将此行为添加到需要它且易于实现的每个模型中。我最大的缺点是,当多个特征想要利用同一个模型事件时,堆叠这些行为可能会导致问题。他们开始争夺优先权,很快就会变得一团糟。
这将我们引向下一个选项,模型观察者。模型观察者是一种基于类的方法来响应模型事件,其中方法对应于被触发的特定事件。
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(); } }
这个类需要在某个地方注册,在服务提供者或模型本身(这是我推荐的地方)。在模型中注册这个观察者可以在模型级别上看到改变雄辩行为的副作用。将其隐藏在服务提供商中的问题在于,除非每个人都知道它的存在,否则很难知道。这种方法的最大缺点是它的可见性。在我看来,正确使用这种方法非常棒。
解决此问题的另一种方法是利用 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, ]; }
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(); } }
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, ]); } }
$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.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.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
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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

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.

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

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

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,

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

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

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