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 事件产生时间
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 ...
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
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
Dynamik aufzeichnen
activity()->log('Look, I logged something');
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'
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('发表了话题');
Oder wenn sich ein Benutzer registriert, möchte ich ein Update aufzeichnen:
activity()->on($user) ->withProperty('event', 'user.created') ->log('加入 EasyWeChat');
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);
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
Der Code lautet wie folgt:
<?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('发表了话题'); } }
Dann registrieren wir diese Abonnementklasse:
Registrieren Sie diese Abonnementklasse in $subscribe in AppProvidersEventServiceProvider:
/** * @var array */ protected $subscribe = [ \App\Listeners\UserActivitySubscriber::class, ];
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!