ホームページ  >  記事  >  バックエンド開発  >  Laravelによるユーザー動的モジュール開発実装例の共有

Laravelによるユーザー動的モジュール開発実装例の共有

黄舟
黄舟オリジナル
2017-09-23 09:33:521263ブラウズ

この記事では主に、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
...

基本的にあらゆる種類のダイナミクスの書き方が異なるため、「フォロー」、「公開」、「返信」、「購入」などの「イベントの種類」も記録する必要があります。

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

データの保存と表示の設計とその実装方法については以前に説明しましたが、もっと熱心であれば、上記の実装方法は明確に説明されています。今日はそれを実装します。推奨されるのは、spatie/laravel-activitylog を使用して次のことを実現することです:

インストールは常に簡単です:

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

ダイナミクスを記録します

$ composer install spatie/laravel-activitylog -vvv

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

activity()->log('Look, I logged something');

メソッドの紹介:

performedOn($model) イベント本体を設定します。これが Eloquent Model インスタンスです

causedBy($user) イベント トリガー、ユーザー インスタンスを設定します

  • withProperties($properties)上記のコンセプト

    performedOn($model) 设置事件主体,也就是 Eloquent Model 实例

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

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

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

  • log($description)

  • withProperty($key, $value) イベント属性の単一使用

log($description) イベントの説明

例、アイテムを記録したい、ユーザーが投稿したディスカッション:


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'

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

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

activity()->on($discussion)
->withProperty('event', 'discussion.created')
->log('发表了话题');
トリガーを設定していないことがわかります。トリガーを設定しない場合、このモジュールはデフォルトで現在ログインしているユーザーになります。

ダイナミクスの表示


ダイナミクスの表示は、条件に従ってデータベースから取得することです。ここでは、パッケージが提供するモデルクラスを使用します: SpatieActivitylogModelsActivity

use SpatieActivitylogModelsActivity;

activity()->on($user)
->withProperty('event', 'user.created')
->log('加入 EasyWeChat');
あとはトラバースするだけです。ディスプレイ。

ある程度の経験とスキル

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


// 全部动态
$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

次に、このサブスクリプションクラスを登録します:🎜 🎜AppProvidersEventServicePro vider 内で、このサブスクリプション クラスを $subscribe に登録します: 🎜🎜🎜🎜
/**
 * @var array
 */
protected $subscribe = [
 \App\Listeners\UserActivitySubscriber::class,
];

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

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

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

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

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

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

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

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

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

总结

以上がLaravelによるユーザー動的モジュール開発実装例の共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。