Maison développement back-end tutoriel php Partager des exemples de Laravel implémentant le développement de modules dynamiques utilisateur

Partager des exemples de Laravel implémentant le développement de modules dynamiques utilisateur

Sep 23, 2017 am 09:33 AM
laravel 动态 模块

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. Apprenons avec l'éditeur ci-dessous.

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    事件产生时间
Copier après la connexion

Le la partie principale est la relation de morphing dans Laravel, relation polymorphe.

Comment afficher

Nos besoins d'affichage dynamique incluent généralement les éléments suivants :

  • I 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
...
Copier après la connexion

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", "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[&#39;event&#39;] ?? &#39;&#39;)
 @case(&#39;discussion.created&#39;)
  ...
  @break
 @case(&#39;comment.created&#39;)
  ...
  @break
@endswitch
Copier après la connexion

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 façon de les mettre en œuvre, si Si vous êtes plus diligent, vous pouvez l'implémenter de manière native. Après tout, la méthode d'implémentation ci-dessus a été clairement décrite. Écrivez simplement du code pour l'implémenter. Ce que je recommande aujourd'hui, c'est d'utiliser spatie/laravel-activitylog pour l'implémenter :

L'installation a été très simple :


$ composer install spatie/laravel-activitylog -vvv
Copier après la connexion

Enregistrer les mises à jour

<🎜. >

Bien sûr, ce type d'enregistrement n'a aucun sens et ne contient presque aucune information utile, donc notre utilisation habituelle devrait être comme ceci :
activity()->log(&#39;Look, I logged something&#39;);
Copier après la connexion


activity()
 ->performedOn($anEloquentModel)
 ->causedBy($user)
 ->withProperties([&#39;customProperty&#39; => &#39;customValue&#39;])
 ->log(&#39;Look, I logged something&#39;);
 
$lastLoggedActivity = Activity::all()->last();

$lastLoggedActivity->subject; //returns an instance of an eloquent model
$lastLoggedActivity->causer; //returns an instance of your user model
$lastLoggedActivity->getExtraProperty(&#39;customProperty&#39;); //returns &#39;customValue&#39;
$lastLoggedActivity->description; //returns &#39;Look, I logged something&#39;
Copier après la connexion
Introduction à la méthode :

  • Définir le sujet de l'événement, qui est l'instance du modèle éloquent

    performedOn($model)

  • Définir le déclencheur d'événement, instance utilisateur

    causedBy($user)

  • Les attributs d'événement dans notre concept ci-dessus

    withProperties($properties)

  • Une utilisation unique des attributs d'événement

    withProperty($key, $value)

  • Description de l'événement

    log($description)

  • Par exemple, nous souhaitons enregistrer un article dans lequel l'utilisateur a posté une discussion :


ou lorsque l'utilisateur s'est inscrit, je souhaite enregistrer une mise à jour :
$discussion = App\Discussion::create([...]);

activity()->on($discussion)
->withProperty(&#39;event&#39;, &#39;discussion.created&#39;)
->log(&#39;发表了话题&#39;);
Copier après la connexion


Vous constaterez que je ne l'ai pas définissez le déclencheur, car ce module est par défaut l'utilisateur actuellement connecté si vous ne définissez pas le déclencheur.
activity()->on($user)
->withProperty(&#39;event&#39;, &#39;user.created&#39;)
->log(&#39;加入 EasyWeChat&#39;);
Copier après la connexion

Afficher la dynamiqueAfficher 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;


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

Quelques expériences et compétencesMettre en place une classe spéciale d'observateurs dynamiques pour enregistrer la dynamique


Le code est le suivant :
$ ./artisan make:listener UserActivitySubscriber
Copier après la connexion


Ensuite, nous enregistrons cette classe d'abonnement :
<?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;);
 }
}
Copier après la connexion

Enregistrez-la dans $subscribe dans AppProvidersEventServiceProvider Catégorie d'abonnement :

/**
 * @var array
 */
protected $subscribe = [
 \App\Listeners\UserActivitySubscriber::class,
];
Copier après la connexion

上面我们利用了 Eloquent 模型事件来监听模型的变化,当各种模型事件创建的时候我们调用对应的方法来记录动态,所以实现起来非常的方便。

在事件属性里记录关键信息

看到上面记录动态的时候你可能会问,只存储了 ID,这种多态关联,查询的时候会压力很大,比如,我们要将动态显示为:

安小超 发布了文章 《自定义菜单的使用》

我们如果只是存储了文章的 id 与类型,我们还需要查询一次文章表,才能得到标题用于显示,这样一个动态列表的话,可能会几十条 SQL 了,的确是这样的,我的解决方案是这样的:

其实我们的用户动态是不要求 100% 精准的,所以,我如果在记录时把文章的标题一起存下来是不是就不用再查表了?其实就是,我们在动态列表需要展示的关键信息,比如标题这些一起用 withProperties 存起来,这样就一条 SQL 解决了动态列表问题。

这样的做法也有弊端,比如文章改了标题的时候,这里就不同步了,当然你也可以在文章修改时来改这个属性,不过我个人认为没有多大必要。毕竟动态就是记录了当时的情况,后来改标题了并没有什么问题。

OK,用户动态模块的开发就分享到这里,如果你有更高级的实现欢迎随时交流。

关于好友动态部分的实现,根据你的应用量级,以及好友关系的存储各有不同,大家自己集思广益即可,大部分都是先查好友关系再查动态,关联查询也可以,自己实现吧。

总结

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 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Vous avez un jeu croisé?
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)

Comparaison des dernières versions de Laravel et CodeIgniter Comparaison des dernières versions de Laravel et CodeIgniter Jun 05, 2024 pm 05:29 PM

Les dernières versions de Laravel 9 et CodeIgniter 4 fournissent des fonctionnalités et des améliorations mises à jour. Laravel9 adopte l'architecture MVC et fournit des fonctions telles que la migration de bases de données, l'authentification et le moteur de modèles. CodeIgniter4 utilise l'architecture HMVC pour fournir le routage, l'ORM et la mise en cache. En termes de performances, le modèle de conception basé sur le fournisseur de services de Laravel9 et le framework léger de CodeIgniter4 lui confèrent d'excellentes performances. Dans les applications pratiques, Laravel9 convient aux projets complexes qui nécessitent de la flexibilité et des fonctions puissantes, tandis que CodeIgniter4 convient au développement rapide et aux petites applications.

Comment les capacités de traitement des données de Laravel et de CodeIgniter se comparent-elles ? Comment les capacités de traitement des données de Laravel et de CodeIgniter se comparent-elles ? Jun 01, 2024 pm 01:34 PM

Comparez les capacités de traitement des données de Laravel et CodeIgniter : ORM : Laravel utilise EloquentORM, qui fournit un mappage relationnel classe-objet, tandis que CodeIgniter utilise ActiveRecord pour représenter le modèle de base de données en tant que sous-classe de classes PHP. Générateur de requêtes : Laravel dispose d'une API de requêtes chaînées flexible, tandis que le générateur de requêtes de CodeIgniter est plus simple et basé sur des tableaux. Validation des données : Laravel fournit une classe Validator qui prend en charge les règles de validation personnalisées, tandis que CodeIgniter a moins de fonctions de validation intégrées et nécessite un codage manuel des règles personnalisées. Cas pratique : l'exemple d'enregistrement d'utilisateur montre Lar

Lequel est le plus adapté aux débutants, Laravel ou CodeIgniter ? Lequel est le plus adapté aux débutants, Laravel ou CodeIgniter ? Jun 05, 2024 pm 07:50 PM

Pour les débutants, CodeIgniter a une courbe d'apprentissage plus douce et moins de fonctionnalités, mais couvre les besoins de base. Laravel offre un ensemble de fonctionnalités plus large mais a une courbe d'apprentissage légèrement plus raide. En termes de performances, Laravel et CodeIgniter fonctionnent bien. Laravel dispose d'une documentation plus complète et d'un support communautaire actif, tandis que CodeIgniter est plus simple, léger et possède de solides fonctionnalités de sécurité. Dans le cas pratique de la création d'une application de blog, EloquentORM de Laravel simplifie la manipulation des données, tandis que CodeIgniter nécessite une configuration plus manuelle.

Laravel vs CodeIgniter : quel framework est le meilleur pour les grands projets ? Laravel vs CodeIgniter : quel framework est le meilleur pour les grands projets ? Jun 04, 2024 am 09:09 AM

Lors du choix d'un framework pour de grands projets, Laravel et CodeIgniter ont chacun leurs propres avantages. Laravel est conçu pour les applications d'entreprise, offrant une conception modulaire, une injection de dépendances et un ensemble de fonctionnalités puissantes. CodeIgniter est un framework léger plus adapté aux projets de petite et moyenne taille, mettant l'accent sur la rapidité et la facilité d'utilisation. Pour les grands projets avec des exigences complexes et un grand nombre d'utilisateurs, la puissance et l'évolutivité de Laravel sont plus adaptées. Pour les projets simples ou les situations avec des ressources limitées, les capacités de développement légères et rapides de CodeIgniter sont plus idéales.

Laravel - Commandes artisanales Laravel - Commandes artisanales Aug 27, 2024 am 10:51 AM

Laravel - Artisan Commands - Laravel 5.7 est livré avec une nouvelle façon de traiter et de tester de nouvelles commandes. Il inclut une nouvelle fonctionnalité de test des commandes artisanales et la démonstration est mentionnée ci-dessous ?

Laravel vs CodeIgniter : quel framework est le meilleur pour les petits projets ? Laravel vs CodeIgniter : quel framework est le meilleur pour les petits projets ? Jun 04, 2024 pm 05:29 PM

Pour les petits projets, Laravel convient aux projets plus importants qui nécessitent des fonctionnalités et une sécurité élevées. CodeIgniter convient aux très petits projets qui nécessitent légèreté et facilité d'utilisation.

Quel est le meilleur moteur de template, Laravel ou CodeIgniter ? Quel est le meilleur moteur de template, Laravel ou CodeIgniter ? Jun 03, 2024 am 11:30 AM

En comparant le moteur de modèles Blade de Laravel et le moteur de modèles Twig de CodeIgniter, choisissez en fonction des besoins du projet et de vos préférences personnelles : Blade est basé sur la syntaxe MVC, qui encourage une bonne organisation du code et un héritage de modèles. Twig est une bibliothèque tierce qui offre une syntaxe flexible, des filtres puissants, une prise en charge étendue et un bac à sable de sécurité.

Laravel - Console artisanale Laravel - Console artisanale Aug 27, 2024 am 10:51 AM

Laravel - Artisan Console - Le framework Laravel fournit trois outils principaux d'interaction via la ligne de commande, à savoir : Artisan, Ticker et REPL. Ce chapitre explique en détail Artisan.

See all articles