Maison >développement back-end >tutoriel php >Explication détaillée du développement du module dynamique utilisateur dans Laravel

Explication détaillée du développement du module dynamique utilisateur dans Laravel

*文
*文original
2018-01-03 17:13:491571parcourir

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');
Bien sûr, ce type d'enregistrement n'a aucun sens et ne contient presque aucune information utile, notre utilisation habituelle devrait donc être comme ceci :

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)

Par exemple, nous souhaitons enregistrer une discussion et l'utilisateur a posté une discussion :

$discussion = App\Discussion::create([...]);
activity()->on($discussion)
->withProperty('event', 'discussion.created')
->log('发表了话题');
Ou lorsqu'un utilisateur s'inscrit, je souhaite enregistrer une mise à jour :

activity()->on($user)
->withProperty('event', 'user.created')
->log('加入 EasyWeChat');
Vous constaterez que je n'ai pas défini de déclencheur, car cela le module est par défaut l'utilisateur actuellement connecté si vous ne définissez pas de déclencheur.

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

use SpatieActivitylogModelsActivity;

// 全部动态
$activities = Activity::all();
// 用户 ID 为 2 的动态 
$activities = Activity::causedBy(User::find(2))->paginate(15);
// 以文章 ID 为 13 为主体的动态
$activities = Activity::forSubject(Post::find(13))->paginate(15);
Ensuite, parcourez simplement l'affichage.

Quelques expériences et compétences

Mettre en place une classe spéciale d'observateurs dynamiques pour enregistrer la dynamique

$ ./artisan make:listener UserActivitySubscriber
Le code est comme suit :

<?php 
namespace App\Listeners;
class UserActivitySubscriber
{
 protected $lisen = [
  &#39;eloquent.created: App\User&#39; => &#39;onUserCreated&#39;,
  &#39;eloquent.created: App\Discussion&#39; => &#39;onDiscussionCreated&#39;,
 ];

 public function subscribe($events)
 {
  foreach ($this->lisen as $event => $listener) {
   $events->lisen($event, __CLASS__.&#39;@&#39;.$listener);
  }
 }

 public function onUserCreated($user)
 {
  activity()->on($user)
   ->withProperty(&#39;event&#39;, &#39;user.created&#39;)
   ->log(&#39;加入 EasyWeChat&#39;);
 }

 public function onDiscussionCreated($discussion)
 {
  activity()->on($discussion)
    ->withProperty(&#39;event&#39;, &#39;discussion.created&#39;)->log(&#39;发表了话题&#39;);
 }
}
Ensuite, nous enregistrons cette classe d'abonnement :

Enregistrons cette classe d'abonnement dans $subscribe dans AppProvidersEventServiceProvider :

/**
 * @var array
 */
protected $subscribe = [
 \App\Listeners\UserActivitySubscriber::class,
];
Ci-dessus, nous avons utilisé le modèle Eloquent Les événements sont utilisés pour surveiller les changements dans le modèle. Lorsque divers événements de modèle sont créés, nous appelons les méthodes correspondantes pour enregistrer la dynamique, ce qui est donc très pratique à mettre en œuvre.

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!

Déclaration:
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