Laravel開発ユーザーダイナミックモジュールの詳細説明

*文
リリース: 2023-03-19 08:46:01
オリジナル
1511 人が閲覧しました

この記事では、Laravel に基づくユーザー動的モジュールの開発に関する関連情報を、サンプル コードを通じて詳しく紹介します。必要な方は、ぜひ参考にしてください。以下の指示に従ってください。お役に立てれば幸いです。

前書き

ほぼすべてのコミュニティ アプリケーションにユーザー更新セクションがあり、ユーザーは友達の更新を通じてより興味深いコンテンツを入手できるため、コミュニティのアクティビティとユーザーの定着率が向上することは誰もが知っていると思います。その実装は通常のコンテンツ発行よりも比較的複雑であり、主にコンテンツの多様性に反映されています。

この問題を解決するには、これらの異なるタイプのコンテンツを抽象化し、共通点を抽出し、同じ構造を使用してそれらを処理する必要があります。これにより、開発がはるかに簡単になります。

概念の要約

ユーザーダイナミクス、その名前が示すように、ダイナミクスの生成は一連のイベントの歴史的記録であるため、まず「イベント」という用語とそれがどのような属性を持っているかに注意してください:

  • コミュニティに基づくトリガー ほとんどすべてのイベントはユーザーによってトリガーされます

  • イベント本体、「xxx 記事が公開されました」の「記事」など、イベントの主な情報。

  • イベントの属性、イベントの主題が異なると、イベントの種類など、異なる追加情報が必要になります。

  • 発生時間、イベントが発生した時間を記録します。通常、データベースにはすべてのデータが生成された時間が記録されます。

ユーザーのダイナミクスを 4 つの基本属性のみを持つ構造に抽象化します。これは実装が簡単です:

- description    事件描述
- causer_id 或者 user_id 事件触发者
- subject_id    主体 ID
- subject_type   主体类型
- properties    事件附加属性
- created_at    事件产生时间
ログイン後にコピー

主要部分は、Laravel のモーフ関係、ポリモーフィックな関連付けです。

表示方法

私たちの動的表示ニーズには通常次のものが含まれます:

  • 友達のダイナミクス

  • 誰かのダイナミクス、通常は個人の中心

  • すべてのダイナミクス、たとえば、すべてLaravel China のホームページのダイナミクスを動的に検索することは比較的まれです

  • 現在、EasyWeChat Web サイトの新しいバージョンを開発しています。これには、ユーザーのダイナミクスも含まれています。例:

    xxx 发布了讨论 《请问大家怎么使用 xxx》
    xxx 评论了 xxx 的话题 《请问大家怎么使用 xxx》
    xxx 回复了 xxx 的评论 “我是按照文档上 ...”
    xxx 购买了 《微信开发:自定义菜单的使用》
    xxx 关注了 xxx
    ...
    ログイン後にコピー
  • 基本的に次のことがわかります。すべてのダイナミクスは同じ方法で記述されますが、異なるため、「フォロー」、「公開」、「返信」、「購入」などの「イベント タイプ」も記録する必要があります。

その後、ブレードまたは他のテンプレート エンジンを使用するときに、ケースの記述を切り替えて、これらのスタイルをレンダリングする別のテンプレートを適用できます。たとえば、ブレードでは、次のようになります:

@switch($activity->properties['event'] ?? '')
 @case('discussion.created')
  ...
  @break
 @case('comment.created')
  ...
  @break
@endswitch
ログイン後にコピー

コード実装

データの保存と表示の設計とその実装方法については以前に説明しましたが、さらに熱心であれば、それを実装するためのコードを記述するだけで、それをネイティブに実装できます。今日お勧めしたいこと spatie/laravel-activitylogを使って実装しています: インストールはいつも簡単ですよね:

$ composer install spatie/laravel-activitylog -vvv
ログイン後にコピー

ダイナミクスの記録

activity()->log('Look, I logged something');
ログイン後にコピー

もちろん、この種の記録は意味がなく、ほとんど役に立ちません情報なので、通常の使用法は次のようになります:

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'
ログイン後にコピー
メソッドの紹介:

performedOn($model) Eloquent Model インスタンスであるイベント本体を設定します

  • causedBy($user)</code code> イベント トリガー、ユーザー インスタンスを設定します <p><code>performedOn($model) 设置事件主体,也就是 Eloquent Model 实例

  • causedBy($user) 设置事件触发者, User 实例

  • withProperties($properties) 上面我们概念里的事件属性

  • withProperty($key, $value) 事件属性的单个用法

  • log($description)

  • withProperties($properties) 上記の概念におけるイベント プロパティ

withProperty($key, $value) </code >イベント属性の単一使用</p><p></p><p><code>log($description) イベントの説明たとえば、記事を記録したいとします。ユーザーがディスカッションを投稿しました:

$discussion = App\Discussion::create([...]);
activity()->on($discussion)
->withProperty(&#39;event&#39;, &#39;discussion.created&#39;)
->log(&#39;发表了话题&#39;);
ログイン後にコピー

または、ユーザーが登録するときに、更新を記録してください:

activity()->on($user)
->withProperty(&#39;event&#39;, &#39;user.created&#39;)
->log(&#39;加入 EasyWeChat&#39;);
ログイン後にコピー

このモジュールにトリガーを設定しない場合、デフォルトでトリガーが設定されていないことがわかります。現在ログインしているユーザー。

ディスプレイダイナミクスディスプレイダイナミクスは、条件に従ってデータベースから取得されます。ここでは、パッケージによって提供されるモデルクラスを使用します: 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);
ログイン後にコピー

その後、ディスプレイを走査するだけです。

いくつかの経験とスキル

ダイナミクスを記録するために特別な動的オブザーバークラスを設定します

$ ./artisan make:listener UserActivitySubscriber
ログイン後にコピー
コードは次のとおりです:
<?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;);
 }
}
ログイン後にコピー
次に、このサブスクリプションクラスを登録します:

🎜これを$subscribeに登録しますAppProvidersEventServiceProvider サブスクリプション クラス: 🎜
/**
 * @var array
 */
protected $subscribe = [
 \App\Listeners\UserActivitySubscriber::class,
];
ログイン後にコピー
🎜 上記では、モデルの変更を監視するために Eloquent モデル イベントを使用しました。さまざまなモデル イベントが作成されると、対応するメソッドを呼び出してダイナミクスを記録するため、実装が非常に便利です。 🎜🎜🎜🎜イベント属性に重要な情報を記録します🎜🎜🎜

上記の記録されたダイナミクスを見ると、ID のみが保存されているのではないかと疑問に思うかもしれません。たとえば、クエリを実行するときに、ダイナミクスを次のように表示したいとします。カスタムメニューの使い方》


記事のIDとタイプを保存するだけの場合、表示するタイトルを取得するために記事テーブルを一度クエリする必要もあります。そのような動的リストの場合、実際には数十のSQLが存在する可能性があります。はい、私の解決策は次のとおりです:

実際、ユーザー ダイナミクスは 100% の精度を必要としません。そのため、記録時に記事のタイトルを保存すれば、テーブルを参照する必要はなくなりますか?実際、タイトルなど、動的リストに表示する必要がある重要な情報は withProperties と一緒に保存されるため、単一の SQL で動的リストの問題が解決されます。

このアプローチには欠点もあります。たとえば、記事のタイトルが変更されると、同期が失われます。もちろん、記事を修正したときにこの属性を変更することもできますが、個人的には必要ないと思います。 。結局のところ、その時の状況を記録するのがダイナミックであり、後からタイトルが変更されても問題ありません。

OK、ユーザー動的モジュールの開発はここで共有されます。より高度な実装がある場合は、お気軽にご連絡ください。

フレンドの動的部分の実装については、アプリケーションのサイズとフレンド関係のストレージによって異なりますが、ほとんどの場合、最初にフレンド関係を確認してから、関連するクエリを確認することができます。バーを自分で実装することもできます。

関連する推奨事項:

Laravel がプリロードを通じてモデルクエリを最適化する方法の詳細な説明

Laravel の url() のルートアドレス変更の詳細な説明

詳しいやり方説明Laravel はスケジュールされたタスクを実装します

以上がLaravel開発ユーザーダイナミックモジュールの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!