Detaillierte Erläuterung des benutzerdynamischen Moduls für die Laravel-Entwicklung

*文
Freigeben: 2023-03-19 08:46:01
Original
1516 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 Sie können es weiter unten verfolgen. Kommen Sie und lernen Sie mit mir. Ich hoffe, es hilft allen.

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 die Benutzerdynamik 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

Der Hauptteil ist die Morph-Relation in Laravel. polymorphe Assoziation.

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 im Grunde jede Dynamik anders geschrieben ist, daher müssen wir auch einen „Ereignistyp“ aufzeichnen, wie zum Beispiel „Folgen“, „Veröffentlichen“, „Antworten“ und „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 bereits das Design der Datenspeicherung und -anzeige besprochen und dann, wie man es implementiert. Wenn Sie sorgfältiger sind, können Sie es implementieren Schließlich wurde die obige Implementierungsmethode klar beschrieben. Schreiben Sie einfach Code, um sie zu implementieren. Ich würde heute empfehlen, spatie/laravel-activitylog zu verwenden, um sie zu implementieren:

Die Installation war immer einfach , rechts:

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

Dynamik 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 es unsere übliche Verwendung sein so:

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 Ereignisbetreff fest, bei dem es sich um die Eloquent Model-Instanz handelt

  • causedBy($user) Legen Sie den Ereignisauslöser fest, Benutzerinstanz

  • withProperties($properties) Das Ereignisattribut in unserem Konzept oben

  • withProperty($key, $value) Verwendung eines einzelnen Ereignisattributs

  • log($description) Ereignisbeschreibung

Zum Beispiel möchten wir eine Diskussion aufzeichnen und Der Benutzer hat eine Diskussion gepostet:

$discussion = App\Discussion::create([...]);
activity()->on($discussion)
->withProperty('event', 'discussion.created')
->log('发表了话题');
Nach dem Login kopieren

Oder wenn sich ein Benutzer registriert, möchte ich ein Update aufzeichnen:

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

Sie werden feststellen, dass ich keinen Auslöser gesetzt habe, weil dies der Fall ist Wenn Sie keinen Auslöser festlegen, verwendet das Modul standardmäßig den aktuell angemeldeten Benutzer.

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 Erfahrungen 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 diese Abonnementklasse in $subscribe in AppProvidersEventServiceProvider:

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

Oben haben wir das Eloquent-Modell verwendet Ereignisse werden verwendet, um Änderungen im Modell zu überwachen. Wenn verschiedene Modellereignisse erstellt werden, rufen wir die entsprechenden Methoden auf, um die Dynamik aufzuzeichnen, sodass die Implementierung sehr einfach ist.

Schlüsselinformationen in Ereignisattributen aufzeichnen

Wenn Sie die oben aufgezeichneten Dynamiken sehen, fragen Sie sich vielleicht, dass diese Art der polymorphen Zuordnung bei der Abfrage sehr stressig sein wird. Beispielsweise möchten wir die Dynamiken wie folgt anzeigen:

Ein Xiaochao hat einen Artikel „Verwenden eines benutzerdefinierten Menüs“ veröffentlicht

Wenn wir nur die ID und den Typ des Artikels speichern, müssen wir auch die Artikeltabelle einmal abfragen, um den Titel zur Anzeige zu erhalten Wenn es sich um eine Liste handelt, gibt es möglicherweise Dutzende von SQLs. Dies ist tatsächlich der Fall:

Tatsächlich erfordert unsere Benutzerdynamik keine 100% ige Genauigkeit Der Titel des Artikels macht es überflüssig, die Tabelle erneut nachzuschlagen? Tatsächlich werden die Schlüsselinformationen, die wir in der dynamischen Liste anzeigen müssen, wie z. B. der Titel, zusammen mit withProperties gespeichert, sodass ein einziges SQL das Problem der dynamischen Liste löst.

Dieser Ansatz hat auch Nachteile, wenn beispielsweise der Titel des Artikels geändert wird. Natürlich kann man dieses Attribut auch ändern, wenn der Artikel geändert wird, aber ich persönlich denke es ist nicht notwendig. Schließlich besteht die Dynamik darin, die Situation zu diesem Zeitpunkt aufzuzeichnen, und es ist kein Problem, wenn der Titel später geändert wird.

OK, die Entwicklung des benutzerdynamischen Moduls wird hier geteilt. Wenn Sie eine fortgeschrittenere Implementierung haben, können Sie uns gerne mitteilen.

Was die Implementierung des dynamischen Freundesteils betrifft, hängt es von der Größe Ihrer Anwendung und dem Speicher der Freundesbeziehungen ab. Die meisten davon können einfach zuerst die Freundesbeziehung prüfen und dann die Aktualisierungen überprüfen. Verwandte Fragen sind auch Okay, mach es selbst.

Verwandte Empfehlungen:

Detaillierte Erklärung, wie Laravel Modellabfragen durch Vorladen optimiert

Detaillierte Erklärung zum Ändern der Stammadresse von url() in Laravel

Detaillierte Erklärung, wie Laravel geplante Aufgaben implementiert

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des benutzerdynamischen Moduls für die Laravel-Entwicklung. 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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!