Table des matières
Ce que vous construisez réellement
1. Structurez votre application avec les limites CQRS
2. Implémentez l'approvisionnement des événements avec une racine agrégée
3. Construisez un magasin d'événements simples
4. Reconstruire l'état des événements
5. Mettez à jour le modèle de lecture (projections)
Notes finales
Maison développement back-end tutoriel php Construire un système CQRS et d'approvisionnement d'événements avec PHP

Construire un système CQRS et d'approvisionnement d'événements avec PHP

Jul 28, 2025 am 12:07 AM
cqrs

Commandes et requêtes distinctes: utilisez CQRS pour découpler les opérations d'écriture (telles que CreateUser) à partir des opérations de lecture (telles que GetUserById), le côté de la commande traite la logique métier et enregistre les événements, et le côté de la requête obtient rapidement des données à partir de tables de lecture optimisées (telles que Users_View); 2. Implémentez la traçabilité des événements: les événements d'enregistrement et de lecture (tels que les créés par l'utilisateur) via la racine agrégée (racine agrégée), les changements d'état sont persistés sous la forme d'événements, soutenant l'audit, le débogage et la reconstruction de l'État; 3. Construire le stockage des événements: utilisez MySQL et d'autres bases de données pour stocker des flux d'événements, charger les séquences d'événements en fonction de l'ID agrégé pour reconstruire les instances agrégées; 4. Mettez à jour le modèle de lecture: appliquez les événements de manière synchrone ou asynchrone à la table de lecture du modèle via le projecteur pour garder la vue de requête mise à jour; 5. Ilétré progressivement: aucun framework n'est requis, commencer par une implémentation simple, se concentrer sur la sérialisation des événements, le contrôle des versions et les tests d'agrégation et s'assurer que la logique du champ central est fiable. Après une mise en œuvre correcte, le système aura une évolutivité élevée, une traçabilité et des capacités d'évolution flexibles.

Construire un système CQRS et d'approvisionnement d'événements avec PHP

La construction d'un système CQRS et d'approvisionnement en événements en PHP peut sembler intimidant au début, mais une fois que vous le décomposez, il devient un moyen puissant de concevoir des applications évolutives et maintenables, en particulier lorsqu'elle traite avec une logique commerciale complexe. Voici un guide pratique pour vous aider à démarrer, sans se noyer en théorie.

Construire un système CQRS et d'approvisionnement d'événements avec PHP

Ce que vous construisez réellement

CQRS (Command Query Responsibility Segregation) signifie séparer les opérations d'écriture (commandes) des opérations de lecture (requêtes).
L'approvisionnement en événement signifie stocker les changements d'état comme une séquence d'événements, plutôt que comme l'état actuel.

Ensemble, ils vous permettent de:

Construire un système CQRS et d'approvisionnement d'événements avec PHP
  • Suivre pourquoi et comment les données ont changé (trace d'audit par conception)
  • Reconstruire l'état des événements (idéal pour le débogage ou l'analyse)
  • L'échelle lit et écrit indépendamment

Voyons une implémentation simplifiée mais réelle dans PHP.


1. Structurez votre application avec les limites CQRS

Commencez par diviser votre application en deux côtés:

Construire un système CQRS et d'approvisionnement d'événements avec PHP
  • Côté de la commande : gère les actions comme "CreateUser", "UpdateMail"
  • Côté de la requête : gère la récupération des données comme "GetUserByid", "ListUsers"
 // Exemple: commande
classe CreateUserCommand
{
    fonction publique __construct (
        Public ReadOnly String $ userId,
        Public ReadOnly String $ Name,
        Public ReadOnly String $ Email
    ) {}
}

// Exemple: gestionnaire de commandes
classe CreateUserHandler
{
    EventStore privé $ EventStore;

    Fonction publique __construct (EventStore $ EventStore)
    {
        $ this-> eventStore = $ EventStore;
    }

    Fonction publique __invoke (CreateUserCommand $ Command): void
    {
        $ user = user :: FromCommand ($ Command);
        $ this-> eventStore-> Enregistrer ($ user-> getunCitTevents ());
        $ user-> ClearEvents (); // IMPORTANT: Réinitialisez après enregistrer
    }
}

Du côté de la requête, restez simple et rapide:

 Classe UserQueryHandler
{
    PDO privé $ PDO;

    fonction publique getUserByid (String $ id) :? Array
    {
        $ stmt = $ this-> pDo-> prépare ("select * dans users_view où id =?");
        $ stmt-> exécuter ([$ id]);
        return $ stmt-> fetch (pdo :: fetch_assoc) ?: null;
    }
}

? Idée clé: le côté de la requête se lit dans une table dénormalisée (comme users_view ) optimisé pour les lectures. Le côté de la commande met à jour le magasin d'événements.


2. Implémentez l'approvisionnement des événements avec une racine agrégée

Un agrégat est un groupe d'objets de domaine traités comme une seule unité. Par exemple, User est une racine agrégée.

 Cours abstraits agrégateroot
{
    Array protégé $ événements = [];
    protégé int $ version = 0;

    Fonction protégée RecordEvent (événement DomaineEvent $): void
    {
        $ this-> événements [] = $ événement;
        $ this-> appliquer ($ event);
    }

    La fonction protégé abstraite s'applique (événement DomaineVent $): void;

    fonction publique getunCitmitedEvents (): Array
    {
        retourner $ this-> événements;
    }

    Fonction publique ClearEvents (): void
    {
        $ this-> events = [];
    }

    fonction publique getVersion (): int
    {
        retourner $ this-> version;
    }
}

Maintenant, créez un agrégat User :

 L'utilisateur de la classe étend la totalité
{
    chaîne privée $ id;
    chaîne privée $ name;
    chaîne privée $ e-mail;
    Bool privé $ actif = true;

    Fonction statique publique Create (CreateUserCommand $ Command): Self
    {
        $ user = new self ();
        $ user-> RecordEvent (Nouveau UserCated (
            $ command-> userId,
            $ Command-> Nom,
            $ Command-> Email
        ));
        retourner $ utilisateur;
    }

    Fonction protégée s'appliquent (événement DomaineVent $): void
    {
        Switch ($ Event) {
            Case $ Événement instance de l'utilisateur créé:
                $ this-> id = $ event-> userId;
                $ this-> name = $ event-> name;
                $ this-> email = $ event-> e-mail;
                $ this-> version;
                casser;
        }
    }
}

Et l'événement:

 Classe Créée par l'utilisateur implémente DomaineEvent
{
    fonction publique __construct (
        Public ReadOnly String $ userId,
        Public ReadOnly String $ Name,
        Public ReadOnly String $ Email,
        Public ReadOnly DatetimeMutable $ se produit = new DateTimeMutable ()
    ) {}
}

3. Construisez un magasin d'événements simples

Le magasin d'événements économise des événements et les charge pour reconstruire des agrégats.

 Interface EventStore
{
    Fonction publique Save (String $ agrégateType, String $ agrégateId, Array $ Events, int $ attendursion): void;
    Charge de fonction publique (String $ agrégateID): Array;
}

Classe MySQLeventStore implémente EventStore
{
    PDO privé $ PDO;

    Fonction publique __construct (PDO $ PDO)
    {
        $ this-> PDO = $ PDO;
    }

    Fonction publique Save (String $ AggregateType, String $ agrégateId, Array $ Events, int $ attendursion): void
    {
        $ this-> pDo-> beginTransaction ();

        foreach ($ Events As $ Event) {
            $ stmt = $ this-> pDo-> préparer (
                "Insérer dans les événements (agrégate_type, agrégate_id, type, charge utile, version, se produit_at)
                 Valeurs (?,?,?,?,?,?,?) "
            ));
            $ stmt-> exécuter ([[
                $ globateType,
                $ agrégateid,
                get_class ($ event),
                JSON_ENCODOD ($ Event),
                $ this-> version, // incrément par événement
                $ Event-> se produit-> format ('ymd h: i: s.u')
            ]));
        }

        $ this-> pDo-> commit ();
    }

    Charge de fonction publique (String $ agrégateid): tableau
    {
        $ stmt = $ this-> pDo-> prépare ("select * dans les événements où agrégate_id =? commander par version");
        $ stmt-> exécuter ([$ agrégateID]);

        $ événements = [];
        foreach ($ stmt comme $ row) {
            $ Payload = JSON_DECODE ($ row ['Payload'], true);
            // Dans les applications réelles, utilisez un mappeur ou un sérialiseur
            $ Events [] = Match ($ row ['type']) {
                UserCated :: class => new UserCreated (
                    $ upload ['userId'],
                    $ la charge utile ['name'],
                    $ upload ['e-mail'],
                    Nouveau DatetimeMutable ($ Payload ['se produit']))
                ),
                default => Throw New \ Exception ("Événement inconnu:". $ Row ['Type'])
            };
        }

        retourner $ événements;
    }
}

? Astuce: vous voudrez verser vos événements et gérer les modifications du schéma plus tard (par exemple, à l'aide de Upcasters).


4. Reconstruire l'état des événements

Lors du chargement d'un User , rejouez tous les événements:

 L'utilisateur de la classe étend la totalité
{
    // ... code précédent

    Fonction statique publique depuis History (Array $ événements): Self
    {
        $ user = new self ();
        foreach ($ Events As $ Event) {
            $ user-> appliquer ($ event);
            $ user-> version;
        }
        retourner $ utilisateur;
    }
}

Utilisation dans le gestionnaire:

 Fonction publique __invoke (CreateUserCommand $ Command): void
{
    $ events = $ this-> eventStore-> chargement ($ command-> userId);
    if (! vide ($ events)) {
        lancer une nouvelle exception ("l'utilisateur existe déjà");
    }

    $ user = user :: create ($ commande);
    $ this-> eventStore-> Enregistrer ('utilisateur', $ command-> userId, $ user-> getunComMttedEvents (), $ user-> getVersion ());
    $ user-> ClearEvents ();
}

5. Mettez à jour le modèle de lecture (projections)

Une fois un événement enregistré, mettez à jour vos tables optimisées en lecture.

 projecteur d'interface
{
    Projet de fonction publique (événement DomaineEvent $): void;
}

Classe UserProjector implémente le projecteur
{
    PDO privé $ PDO;

    Projet de fonction publique (événement DomaineVent $): void
    {
        if ($ event instanceof userreated) {
            $ this-> PDO-> Préparer (
                "Insérer dans users_view (id, nom, e-mail, création_at) VALEURS (?,? ,?)"
            ) -> exécuter ([
                $ event-> userId,
                $ Event-> Nom,
                $ event-> e-mail,
                $ event-> se produit-> format ('ymd h: i: s')
            ]));
        }
    }
}

Vous pouvez gérer des projets:

  • Synchrone (simple, cohérent)
  • Via une file d'attente de messages (cohérence évolutive, éventuelle)

Notes finales

  • Utilisez une injection de dépendance (par exemple, Symfony, Laravel ou Container Plain)
  • Sérialiser attentivement
  • Envisagez d'utiliser des Uuids pour les ID agrégés
  • Ajouter des métadonnées aux événements (par exemple, IP utilisateur, ID de trace)
  • Testez vos agrégats fortement - ils sont le cœur de votre domaine

Ce n'est pas trivial, mais vous n'avez pas besoin d'un cadre pour commencer. Avec PHP ordinaire, les interfaces et la bonne séparation, vous pouvez construire une base solide. La véritable puissance apparaît lorsque vos règles commerciales augmentent et que vous devez auditer, rejouer ou étendre le comportement sans casser les choses.

Fondamentalement: commencez petit, obtenez le bon flux et laissez les événements parler.

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

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.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

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)

Sujets chauds

Tutoriel PHP
1538
276
PHP appelle AI Intelligent Voice Assistant Assistant PHP Interaction System Construction PHP appelle AI Intelligent Voice Assistant Assistant PHP Interaction System Construction Jul 25, 2025 pm 08:45 PM

L'entrée vocale de l'utilisateur est capturée et envoyée au backend PHP via l'API MediaRecorder du JavaScript frontal; 2. PHP enregistre l'audio en tant que fichier temporaire et appelle STTAPI (tel que Google ou Baidu Voice Recognition) pour le convertir en texte; 3. PHP envoie le texte à un service d'IA (comme Openaigpt) pour obtenir une réponse intelligente; 4. PHP appelle ensuite TTSAPI (comme Baidu ou Google Voice Synthesis) pour convertir la réponse en fichier vocal; 5. PHP diffuse le fichier vocal vers l'avant pour jouer, terminant l'interaction. L'ensemble du processus est dominé par PHP pour assurer une connexion transparente entre toutes les liens.

Comment utiliser PHP pour créer des fonctions de partage social PHP Partage d'interface Pratique Comment utiliser PHP pour créer des fonctions de partage social PHP Partage d'interface Pratique Jul 25, 2025 pm 08:51 PM

La méthode principale de création de fonctions de partage social dans PHP est de générer dynamiquement des liens de partage qui répondent aux exigences de chaque plate-forme. 1. Obtenez d'abord la page actuelle ou les informations d'URL et d'article spécifiées; 2. Utilisez UrLencode pour coder les paramètres; 3. Épisser et générer des liens de partage en fonction des protocoles de chaque plate-forme; 4. Afficher les liens sur l'avant pour que les utilisateurs puissent cliquer et partager; 5. Générez dynamiquement des balises OG sur la page pour optimiser l'affichage du contenu du partage; 6. Assurez-vous d'échapper à la saisie des utilisateurs pour empêcher les attaques XSS. Cette méthode ne nécessite pas d'authentification complexe, a de faibles coûts de maintenance et convient à la plupart des besoins de partage de contenu.

Comment utiliser PHP combiné avec l'IA pour obtenir la correction de texte de la syntaxe PHP détection et l'optimisation Comment utiliser PHP combiné avec l'IA pour obtenir la correction de texte de la syntaxe PHP détection et l'optimisation Jul 25, 2025 pm 08:57 PM

Pour réaliser la correction d'erreur de texte et l'optimisation de la syntaxe avec l'IA, vous devez suivre les étapes suivantes: 1. Sélectionnez un modèle ou une API d'IA appropriée, tels que Baidu, Tencent API ou bibliothèque NLP open source; 2. Appelez l'API via Curl ou Guzzle de PHP et traitez les résultats de retour; 3. Afficher les informations de correction d'erreur dans l'application et permettre aux utilisateurs de choisir d'adopter l'adoption; 4. Utilisez PHP-L et PHP_CODESNIFFER pour la détection de syntaxe et l'optimisation du code; 5. Collectez en continu les commentaires et mettez à jour le modèle ou les règles pour améliorer l'effet. Lorsque vous choisissez AIAPI, concentrez-vous sur l'évaluation de la précision, de la vitesse de réponse, du prix et du support pour PHP. L'optimisation du code doit suivre les spécifications du PSR, utiliser le cache raisonnablement, éviter les requêtes circulaires, revoir le code régulièrement et utiliser x

PHP crée un système de commentaires de blog pour monétiser la revue des commentaires PHP et la stratégie anti-brosse PHP crée un système de commentaires de blog pour monétiser la revue des commentaires PHP et la stratégie anti-brosse Jul 25, 2025 pm 08:27 PM

1. La maximisation de la valeur commerciale du système de commentaires nécessite de combiner la livraison précise de la publicité native, les services à valeur ajoutée par l'utilisateur (tels que le téléchargement d'images, les commentaires de recharge), d'influencer le mécanisme d'incitation basé sur la qualité des commentaires et la conformité de la monétisation anonyme des données de données; 2. La stratégie d'audit doit adopter une combinaison de mécanismes de filtrage des mots clés dynamiques pré-audit et de signalement des utilisateurs, complétés par une note de qualité des commentaires pour réaliser une exposition hiérarchique de contenu; 3. Anti-brosses nécessite la construction d'une défense multicouche: la vérification sans capteur RecaptChav3, le robot de reconnaissance de champ de miel, IP et la limite de fréquence d'horodatage empêchent l'arrosage, et la reconnaissance du modèle de contenu marque les commentaires suspects et itéra en continu pour traiter les attaques.

Comment utiliser PHP pour combiner l'IA pour générer une image. PHP génère automatiquement des œuvres d'art Comment utiliser PHP pour combiner l'IA pour générer une image. PHP génère automatiquement des œuvres d'art Jul 25, 2025 pm 07:21 PM

PHP n'effectue pas directement un traitement d'image AI, mais s'intègre via les API, car il est bon dans le développement Web plutôt que dans les tâches à forte intensité informatique. L'intégration de l'API peut atteindre une division professionnelle du travail, réduire les coûts et améliorer l'efficacité; 2. Intégration des technologies clés incluez l'utilisation de Guzzle ou Curl pour envoyer des demandes HTTP, le codage et le décodage des données JSON, l'authentification de la sécurité des clés de l'API, les tâches de traitement de la file d'attente asynchrones, les tâches prenant du temps, la gestion des erreurs robuste et le mécanisme de retrait, le stockage et l'affichage d'images; 3. Les défis courants incluent le coût des API incontrôlable, les résultats de génération incontrôlables, la mauvaise expérience utilisateur, les risques de sécurité et la gestion difficile des données. Les stratégies de réponse consistent à définir des quotas et des caches utilisateur, en fournissant des conseils ProTT et une sélection multi-images, des notifications asynchrones et des invites de progrès, un stockage et un audit de contenu de la variable d'environnement clé et un stockage cloud.

PHP réalise la gestion des stocks de produits de base et la monétisation de la synchronisation et du mécanisme d'alarme de l'inventaire PHP PHP réalise la gestion des stocks de produits de base et la monétisation de la synchronisation et du mécanisme d'alarme de l'inventaire PHP Jul 25, 2025 pm 08:30 PM

PHP assure l'atomicité de la déduction des stocks via les transactions de base de données et les verrous en ligne de Forupdate pour empêcher la survente élevée élevée en simultation; 2. La cohérence de l'inventaire multiplateforme dépend de la gestion centralisée et de la synchronisation axée sur les événements, combinant des notifications API / WebHook et des files d'attente de messages pour assurer une transmission fiable de données; 3. Le mécanisme d'alarme doit définir un faible inventaire, un inventaire zéro / négatif, des ventes invidables, des cycles de réapprovisionnement et des stratégies de fluctuations anormales dans différents scénarios, et sélectionner Dingtalk, SMS ou les personnes responsables par e-mail en fonction de l'urgence, et les informations d'alarme doivent être complètes et claires pour réaliser l'adaptation et la réponse rapide.

Comment utiliser PHP pour développer une plate-forme communautaire Q&A explication détaillée du modèle de monétisation communautaire interactive PHP Comment utiliser PHP pour développer une plate-forme communautaire Q&A explication détaillée du modèle de monétisation communautaire interactive PHP Jul 23, 2025 pm 07:21 PM

1. Le premier choix pour la combinaison Laravel Mysql Vue / React dans la communauté de questions et réponses de développement PHP est le premier choix pour la combinaison Laravel Mysql Vue / React, en raison de sa maturité dans l'écosystème et de l'efficacité de développement élevée; 2. Les performances élevées nécessitent une dépendance à la cache (redis), une optimisation de la base de données, des files d'attente CDN et asynchrones; 3. La sécurité doit être effectuée avec le filtrage d'entrée, la protection CSRF, les HTTP, le cryptage de mot de passe et le contrôle d'autorisation; 4. Publicité facultative, abonnement aux membres, récompenses, commissions, paiement des connaissances et autres modèles, le noyau est de faire correspondre le ton communautaire et les besoins des utilisateurs.

Au-delà de la pile de lampe: le rôle de PHP dans l'architecture d'entreprise moderne Au-delà de la pile de lampe: le rôle de PHP dans l'architecture d'entreprise moderne Jul 27, 2025 am 04:31 AM

PhpisstillRelevantinmodernerterpriseenvironments.1.modernPhp (7.xand8.x) offre des performances, des stricts, un jitcompilation, et modernsyntax, rendant la main

See all articles