Cet article vous présente principalement les informations pertinentes sur le développement de modules dynamiques utilisateur basés sur Laravel. L'article le présente en détail à travers un exemple de code. Il a une certaine valeur d'apprentissage de référence pour les études ou le travail de tous les amis qui en ont besoin. pouvez le suivre ci-dessous. Venez apprendre avec moi. J'espère que cela aide tout le monde.
Avant-propos
Je crois que tout le monde sait que presque toutes les applications communautaires ont une section de statut d'utilisateur, que les utilisateurs peuvent obtenir via le statut d'ami Contenu plus intéressant , augmentant ainsi l'activité de la communauté et la fidélité des utilisateurs. Sa mise en œuvre est relativement plus compliquée que la publication de contenu ordinaire, ce qui se reflète principalement dans la diversité du contenu.
Afin de résoudre ce problème, nous devons faire abstraction de ces différents types de contenu, extraire les points communs et utiliser la même structure pour les traiter, ce qui rendra le développement beaucoup plus simple.
Abstraction conceptuelle
Dynamique des utilisateurs, comme son nom l'indique, la génération de dynamiques est l'enregistrement historique d'une série d'événements, donc d'abord concentrez-vous sur le nom "événement", quels attributs possède-t-il :
Déclencheur, presque tous les événements basés sur la communauté sont déclenchés par les utilisateurs
Sujet de l'événement, événement Les informations principales, telles que « article » dans « xxx a publié un article ».
Attributs d'événement, différents sujets d'événement nécessitent différentes informations supplémentaires, telles que le type d'événement.
L'heure d'occurrence enregistre l'heure à laquelle l'événement se produit. Bien entendu, notre base de données enregistre généralement l'heure à laquelle toutes les données sont générées.
Nous résumons la dynamique des utilisateurs dans une structure avec seulement 4 attributs de base, qui est plus facile à mettre en œuvre :
- description 事件描述 - causer_id 或者 user_id 事件触发者 - subject_id 主体 ID - subject_type 主体类型 - properties 事件附加属性 - created_at 事件产生时间
La partie principale est la relation morph dans Laravel , association polymorphe.
Comment afficher
Nos besoins en affichage dynamique incluent généralement les éléments suivants :
Mes amis ' mises à jour
Les mises à jour d'une personne, généralement le centre personnel
toutes les mises à jour, telles que toutes les mises à jour sur la page d'accueil de Laravel Chine
Recherche dynamique, relativement rare
Je développe actuellement une nouvelle version du site EasyWeChat, qui dispose également de dynamiques d'utilisateurs, par exemple :
xxx 发布了讨论 《请问大家怎么使用 xxx》 xxx 评论了 xxx 的话题 《请问大家怎么使用 xxx》 xxx 回复了 xxx 的评论 “我是按照文档上 ...” xxx 购买了 《微信开发:自定义菜单的使用》 xxx 关注了 xxx ...
Vous constaterez que fondamentalement, chaque dynamique est écrite différemment, nous devons donc également enregistrer un « type d'événement », tel que « suivre », « publier », « répondre » et « acheter ».
Ensuite, lorsque nous utilisons Blade ou d'autres moteurs de modèles, nous pouvons changer... d'écriture de cas pour appliquer différents modèles pour rendre ces styles. Par exemple, dans Blade, mon utilisation :
@switch($activity->properties['event'] ?? '') @case('discussion.created') ... @break @case('comment.created') ... @break @endswitch
Mise en œuvre du code
Nous avons déjà discuté de la conception du stockage et de l'affichage des données, puis de la manière de les mettre en œuvre. Si vous êtes plus diligent, vous pouvez le mettre en œuvre. nativement. Après tout, la méthode d'implémentation ci-dessus a été clairement décrite, il suffit d'écrire du code pour l'implémenter. Ce que je recommanderais aujourd'hui, c'est d'utiliser spatie/laravel-activitylog pour l'implémenter : L'installation a toujours été simple. , à droite :$ composer install spatie/laravel-activitylog -vvv
Dynamique des enregistrements
activity()->log('Look, I logged something');
activity() ->performedOn($anEloquentModel) ->causedBy($user) ->withProperties(['customProperty' => 'customValue']) ->log('Look, I logged something'); $lastLoggedActivity = Activity::all()->last(); $lastLoggedActivity->subject; //returns an instance of an eloquent model $lastLoggedActivity->causer; //returns an instance of your user model $lastLoggedActivity->getExtraProperty('customProperty'); //returns 'customValue' $lastLoggedActivity->description; //returns 'Look, I logged something'
Introduction à la méthode :
Définissez le sujet de l'événement, qui est l'instance du modèle éloquentperformedOn($model)
Définir le déclencheur d'événement, Instance utilisateur causedBy($user)
L'attribut d'événement dans notre concept ci-dessus withProperties($properties)
Utilisation d'un seul attribut d'événementwithProperty($key, $value)
Description de l'événementlog($description)
$discussion = App\Discussion::create([...]); activity()->on($discussion) ->withProperty('event', 'discussion.created') ->log('发表了话题');
activity()->on($user) ->withProperty('event', 'user.created') ->log('加入 EasyWeChat');
Afficher la dynamique
Afficher la dynamique consiste à la sortir de la base de données selon les conditions La classe de modèle fournie par le package est utilisée ici. : SpatieActivitylogModelsActivityuse SpatieActivitylogModelsActivity;// 全部动态 $activities = Activity::all(); // 用户 ID 为 2 的动态 $activities = Activity::causedBy(User::find(2))->paginate(15); // 以文章 ID 为 13 为主体的动态 $activities = Activity::forSubject(Post::find(13))->paginate(15);
Quelques expériences et compétences
Mettre en place une classe spéciale d'observateurs dynamiques pour enregistrer la dynamique$ ./artisan make:listener UserActivitySubscriber
<?php namespace App\Listeners; class UserActivitySubscriber { protected $lisen = [ 'eloquent.created: App\User' => 'onUserCreated', 'eloquent.created: App\Discussion' => 'onDiscussionCreated', ]; public function subscribe($events) { foreach ($this->lisen as $event => $listener) { $events->lisen($event, __CLASS__.'@'.$listener); } } public function onUserCreated($user) { activity()->on($user) ->withProperty('event', 'user.created') ->log('加入 EasyWeChat'); } public function onDiscussionCreated($discussion) { activity()->on($discussion) ->withProperty('event', 'discussion.created')->log('发表了话题'); } }
/** * @var array */ protected $subscribe = [ \App\Listeners\UserActivitySubscriber::class, ];
Enregistrer les informations clés dans les attributs de l'événement
Lorsque vous voyez la dynamique enregistrée ci-dessus, vous pouvez demander, seul l'ID est stocké. Ce type d'association polymorphe sera très stressant lors de l'interrogation. Par exemple, nous souhaitons afficher la dynamique comme :
. An Xiaochao a publié un article "Utilisation du menu personnalisé"
Si nous stockons uniquement l'identifiant et le type de l'article, nous devons également interroger la table des articles une fois pour obtenir le titre à afficher. S'il s'agit d'une liste, il peut y avoir des dizaines de SQL. C'est effectivement le cas. Ma solution est la suivante :
En fait, notre dynamique utilisateur ne nécessite pas une précision à 100%, donc si j'enregistre, il y a une sauvegarde. le titre de l'article élimine-t-il le besoin de consulter à nouveau le tableau ? En fait, les informations clés que nous devons afficher dans la liste dynamique, telles que le titre, sont stockées avec withProperties, de sorte qu'un seul SQL résout le problème de la liste dynamique.
Cette approche présente également des inconvénients. Par exemple, lorsque le titre de l'article est modifié, il sera désynchronisé. Bien sûr, vous pouvez également modifier cet attribut lorsque l'article est modifié, mais je pense personnellement. ce n'est pas nécessaire. Après tout, la dynamique est d'enregistrer la situation à ce moment-là, et il n'y a aucun problème si le titre est modifié plus tard.
OK, le développement du module dynamique utilisateur sera partagé ici. Si vous avez une implémentation plus avancée, n'hésitez pas à communiquer.
Concernant la mise en œuvre de la partie dynamique des amis, cela dépend de la taille de votre application et du stockage des relations amicales. Vous pouvez simplement réfléchir à des idées. La plupart d'entre elles vérifient d'abord la relation amicale, puis vérifient les mises à jour. Les requêtes associées sont également OK, faites-le vous-même.
Recommandations associées :
Explication détaillée de la façon dont Laravel optimise les requêtes de modèle via le préchargement
Explication détaillée de la modification de l'adresse racine de url() dans Laravel
Explication détaillée de la façon dont Laravel implémente les tâches planifiées
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!