Teilen Sie Beispiele für die Implementierung benutzerdynamischer Modulentwicklung durch Laravel

黄舟
Freigeben: 2023-03-16 11:04:02
Original
1259 Leute haben es durchsucht

Dieser Artikel führt Sie hauptsächlich in die relevanten Informationen zur Entwicklung benutzerdynamischer Module auf Basis von Laravel ein. Der Artikel stellt ihn anhand von Beispielcodes ausführlich vor Lassen Sie uns mit dem untenstehenden Herausgeber lernen.

Vorwort

Ich glaube, jeder weiß, dass fast alle Community-Anwendungen einen Benutzerstatusbereich haben, den Benutzer über den Freundesstatus erhalten können. Weitere interessante Inhalte , wodurch die Community-Aktivität und die Benutzerbindung erhöht werden. Seine Implementierung ist relativ komplizierter als die gewöhnliche Veröffentlichung von Inhalten, was sich hauptsächlich in der Vielfalt der Inhalte widerspiegelt.

Um dieses Problem zu lösen, müssen wir diese verschiedenen Arten von Inhalten abstrahieren, Gemeinsamkeiten extrahieren und dieselbe Struktur verwenden, um sie zu verarbeiten, was die Entwicklung viel einfacher macht.

Konzeptionelle Abstraktion

Benutzerdynamik, wie der Name schon sagt, ist die Erzeugung von Dynamik die historische Aufzeichnung einer Reihe von Ereignissen, also zuerst Konzentrieren Sie sich auf das „Ereignis“. Substantiv, welche Attribute hat es:

  • Auslöser, fast alle Ereignisse, die auf der Community basieren, werden von Benutzern ausgelöst

  • Betreff der Veranstaltung, Veranstaltung Die Hauptinformationen, z. B. „Artikel“ in „xxx hat einen Artikel veröffentlicht“.

  • Ereignisattribute, unterschiedliche Ereignisthemen erfordern unterschiedliche zusätzliche Informationen, wie z. B. den Ereignistyp.

  • Die Ereigniszeit zeichnet den Zeitpunkt auf, zu dem das Ereignis auftritt. Natürlich zeichnet unsere Datenbank normalerweise den Zeitpunkt auf, zu dem alle Daten generiert werden.

Wir abstrahieren Benutzerdynamiken in eine Struktur mit nur 4 Grundattributen, die einfacher zu implementieren ist:


- description    事件描述
- causer_id 或者 user_id 事件触发者
- subject_id    主体 ID
- subject_type   主体类型
- properties    事件附加属性
- created_at    事件产生时间
Nach dem Login kopieren

Die Hauptteil ist die Morph-Relation in Laravel, polymorphe Relation.

So zeigen Sie

Unsere dynamischen Anzeigeanforderungen umfassen normalerweise Folgendes:

  • Ich, Freunde ' Updates

  • Updates einer Person, normalerweise persönliches Center

  • alle Updates, z. B. alle Updates auf der Laravel China-Homepage

  • Dynamische Suche, relativ selten

Ich entwickle derzeit eine neue Version der EasyWeChat-Website, die auch über Benutzerdynamik verfügt, zum Beispiel:


xxx 发布了讨论 《请问大家怎么使用 xxx》
xxx 评论了 xxx 的话题 《请问大家怎么使用 xxx》
xxx 回复了 xxx 的评论 “我是按照文档上 ...”
xxx 购买了 《微信开发:自定义菜单的使用》
xxx 关注了 xxx
...
Nach dem Login kopieren

Sie werden feststellen, dass grundsätzlich jede Dynamik anders geschrieben ist, daher müssen wir auch einen „Ereignistyp“ erfassen, wie zum Beispiel „Folgen“, „Veröffentlichen“, „Antworten“, „Kauf“. " ".

Wenn wir dann Blade- oder andere Template-Engines verwenden, können wir ... das Fallschreiben ändern, um verschiedene Vorlagen zum Rendern dieser Stile anzuwenden. Zum Beispiel in Blade, meine Verwendung:


@switch($activity->properties['event'] ?? '')
 @case('discussion.created')
  ...
  @break
 @case('comment.created')
  ...
  @break
@endswitch
Nach dem Login kopieren

Code-Implementierung

Wir haben zuvor das Design der Datenspeicherung und -anzeige besprochen und dann, wie es implementiert wird Wenn Sie sorgfältiger sind, können Sie es nativ implementieren. Schreiben Sie einfach Code, um es zu implementieren:

Die Installation war sehr einfach, richtig:


$ composer install spatie/laravel-activitylog -vvv
Nach dem Login kopieren

Updates aufzeichnen


activity()->log('Look, I logged something');
Nach dem Login kopieren

Natürlich ist diese Art von Aufzeichnung bedeutungslos und enthält fast keine nützlichen Informationen, daher sollte unsere übliche Verwendung wie folgt aussehen:


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'
Nach dem Login kopieren

Methodeneinführung:

  • performedOn($model) Legen Sie den Betreff des Ereignisses fest, bei dem es sich um die Eloquent Model-Instanz handelt.

  • causedBy($user) Festlegen der Ereignisauslöser, Benutzerinstanz

  • withProperties($properties) Die Ereignisattribute in unserem Konzept oben

  • withProperty($key, $value) Eine einzelne Verwendung von Ereignisattributen

  • log($description) Ereignisbeschreibung

Zum Beispiel möchten wir einen Artikel aufzeichnen, in dem der Benutzer eine Diskussion gepostet hat:


$discussion = App\Discussion::create([...]);

activity()->on($discussion)
->withProperty('event', 'discussion.created')
->log('发表了话题');
Nach dem Login kopieren

oder wenn der Benutzer sich registriert hat, möchte ich ein Update aufzeichnen:


activity()->on($user)
->withProperty('event', 'user.created')
->log('加入 EasyWeChat');
Nach dem Login kopieren

Sie werden feststellen, dass ich das nicht getan habe Legen Sie den Auslöser fest, da dieses Modul standardmäßig auf den aktuell angemeldeten Benutzer zurückgreift, wenn Sie den Auslöser nicht festlegen.

Dynamik anzeigen

Die Anzeige der Dynamik erfolgt entsprechend den Bedingungen aus der Datenbank. Hier wird die vom Paket bereitgestellte Modellklasse verwendet : 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);
Nach dem Login kopieren

Dann durchqueren Sie einfach die Anzeige.

Einige Erfahrung und Fähigkeiten

Richten Sie eine spezielle dynamische Beobachterklasse ein, um Dynamiken aufzuzeichnen


$ ./artisan make:listener UserActivitySubscriber
Nach dem Login kopieren

Der Code lautet wie folgt:


<?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;);
 }
}
Nach dem Login kopieren

Dann registrieren wir diese Abonnementklasse:

Registrieren Sie dies in $subscribe in AppProvidersEventServiceProvider Abonnementkategorie:


/**
 * @var array
 */
protected $subscribe = [
 \App\Listeners\UserActivitySubscriber::class,
];
Nach dem Login kopieren

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

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

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

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

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

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

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

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

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

总结

Das obige ist der detaillierte Inhalt vonTeilen Sie Beispiele für die Implementierung benutzerdynamischer Modulentwicklung durch Laravel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage