亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

基于Laravel實現的用戶動態模塊開發

2024-05-05 00:00:12
字體:
來源:轉載
供稿:網友

前言

相信大家都知道,幾乎所有的社區應用都有用戶動態這個部分,用戶可以通過好友動態獲能取到更多感興趣的內容,從而提高社區活躍度和用戶粘性。它的實現相對來講比普通的內容發布要復雜一些,主要體現在內容多樣性上。

為了解決這個問題,我們得把這些不同類型的內容抽象,提取共性,使用相同的結構來處理,開發起來就會簡單很多。

概念抽象

用戶動態,顧名思義,動態的產生,就是一系列事件的歷史記錄,所以首先關注“事件”這個名詞,它有哪些屬性:

  • 觸發者,基于社區所有的事件幾乎都是由用戶觸發的
  • 事件主體,事件的主體信息,例如“xxx發布了文章” 中的 “文章”。
  • 事件屬性,事件主體不同,所需要的附加信息也不同,比如事件類型。
  • 發生時間,記錄事件產生的時間,當然了在我們的數據庫通常記錄了所有數據產生的時間。

我們將用戶動態抽象成只有 4 個基礎屬性的結構,就比較容易實現了:

- description    事件描述- causer_id 或者 user_id 事件觸發者- subject_id    主體 ID- subject_type   主體類型- properties    事件附加屬性- created_at    事件產生時間

而主體部分就是 Laravel 里的 morph relation, 多態關聯。

怎么展示

我們的動態展示需求通常有以下幾種:

  • 我的好友的動態
  • 某個人的動態,通常是個人中心
  • 全部動態,比如 Laravel China 首頁的全部動態
  • 動態搜索,比較少見

我最近正在開發 EasyWeChat 新版網站,其中也有用戶動態,舉例:

xxx 發布了討論 《請問大家怎么使用 xxx》xxx 評論了 xxx 的話題 《請問大家怎么使用 xxx》xxx 回復了 xxx 的評論 “我是按照文檔上 ...”xxx 購買了 《微信開發:自定義菜單的使用》xxx 關注了 xxx...

你會發現,基本上每種動態的寫法都不一樣,所以我們還需要記錄一個 “事件類型” ,比如 “關注”、 “發布”、“回復”、“購買”。

然后我們在 blade 或者其它模板引擎的使用中,就可以 switch ... case 寫法,來應用不同的模板渲染這些樣式,比如 blade 中,我的用法:

@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) 設置事件觸發者, User 實例
  • withProperties($properties) 上面我們概念里的事件屬性
  • withProperty($key, $value) 事件屬性的單個用法
  • log($description) 事件描述

比如,我們要記錄一條,用戶發布了討論:

$discussion = App/Discussion::create([...]);activity()->on($discussion)->withProperty('event', 'discussion.created')->log('發表了話題');

或者用戶注冊時,我要記錄一條動態:

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

你會發現我都沒有設置觸發者,因為這個模塊如果你沒設置觸發者默認就是當前登錄用戶。

展示動態

展示動態就是根據條件從數據庫拿出來,這里使用包提供的模型類:Spatie/Activitylog/Models/Activity

use Spatie/Activitylog/Models/Activity;

// 全部動態$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 = [  '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('發表了話題'); }}

然后我們去注冊這個訂閱類:

在 App/Providers/EventServiceProvider 中 $subscribe 中注冊這個訂閱類:

/** * @var array */protected $subscribe = [ /App/Listeners/UserActivitySubscriber::class,];

上面我們利用了 Eloquent 模型事件來監聽模型的變化,當各種模型事件創建的時候我們調用對應的方法來記錄動態,所以實現起來非常的方便。

在事件屬性里記錄關鍵信息

看到上面記錄動態的時候你可能會問,只存儲了 ID,這種多態關聯,查詢的時候會壓力很大,比如,我們要將動態顯示為:

安小超 發布了文章 《自定義菜單的使用》

我們如果只是存儲了文章的 id 與類型,我們還需要查詢一次文章表,才能得到標題用于顯示,這樣一個動態列表的話,可能會幾十條 SQL 了,的確是這樣的,我的解決方案是這樣的:

其實我們的用戶動態是不要求 100% 精準的,所以,我如果在記錄時把文章的標題一起存下來是不是就不用再查表了?其實就是,我們在動態列表需要展示的關鍵信息,比如標題這些一起用 withProperties 存起來,這樣就一條 SQL 解決了動態列表問題。

這樣的做法也有弊端,比如文章改了標題的時候,這里就不同步了,當然你也可以在文章修改時來改這個屬性,不過我個人認為沒有多大必要。畢竟動態就是記錄了當時的情況,后來改標題了并沒有什么問題。

OK,用戶動態模塊的開發就分享到這里,如果你有更高級的實現歡迎隨時交流。

關于好友動態部分的實現,根據你的應用量級,以及好友關系的存儲各有不同,大家自己集思廣益即可,大部分都是先查好友關系再查動態,關聯查詢也可以,自己實現吧。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕亚洲图片| 伊人久久久久久久久久久久久| 538国产精品一区二区免费视频| 国内精品模特av私拍在线观看| 国产精品久久久久9999| 亚洲激情电影中文字幕| 青草青草久热精品视频在线观看| 亚洲国产福利在线| 久久国产精品久久国产精品| 国外视频精品毛片| 亚洲视频精品在线| 亚洲午夜av电影| 亚洲风情亚aⅴ在线发布| 久久成人精品一区二区三区| 国产精品成人一区二区| 欧美激情国产日韩精品一区18| 国产高清视频一区三区| 成人性生交xxxxx网站| 91免费看片在线| 国产一区二区日韩| 亚洲影院污污.| 成人国产精品一区二区| 久久久久国产视频| 国产一区二区精品丝袜| 国产成人亚洲综合91精品| 久热精品视频在线观看一区| 国产精品久久久久久久美男| 国产精品www网站| 国产精品video| 茄子视频成人在线| 国产视频欧美视频| 亚洲精品免费av| 国产色婷婷国产综合在线理论片a| 亚洲精品日韩av| 久久精品人人爽| 国产精品网站视频| 欧美自拍大量在线观看| 欧美在线观看一区二区三区| 亚洲日本成人女熟在线观看| 日韩免费在线电影| 欧美在线精品免播放器视频| 伊人久久男人天堂| 777精品视频| 理论片在线不卡免费观看| 国产在线视频91| 亚洲精品国产suv| 亚洲激情在线观看视频免费| 日韩成人在线观看| 午夜精品久久久久久久99热浪潮| 在线国产精品视频| 国产亚洲欧洲黄色| 国模精品视频一区二区| 国产综合久久久久久| 91精品国产综合久久香蕉922| 久久精品色欧美aⅴ一区二区| 久久亚洲国产精品成人av秋霞| 热99精品只有里视频精品| 欧美高清一级大片| 26uuu另类亚洲欧美日本一| 欧美日韩亚洲视频一区| 国模视频一区二区三区| 在线亚洲男人天堂| 久久国产精品久久久久久久久久| 日韩精品久久久久久福利| 伦伦影院午夜日韩欧美限制| 国产一区二区三区在线观看视频| 日韩av有码在线| 精品人伦一区二区三区蜜桃免费| 最新国产成人av网站网址麻豆| 亚洲性生活视频在线观看| 国产啪精品视频网站| 懂色av中文一区二区三区天美| 午夜精品久久久久久久99热| 黑丝美女久久久| 久久精品视频免费播放| 国产精品视频公开费视频| 欧美极品少妇与黑人| 国产美女精品视频免费观看| 日韩在线观看高清| 两个人的视频www国产精品| 国产精品电影一区| 高潮白浆女日韩av免费看| 91精品啪在线观看麻豆免费| 国产成人涩涩涩视频在线观看| 中文字幕欧美精品日韩中文字幕| 日韩av在线精品| 亚洲大尺度美女在线| 国模私拍一区二区三区| 少妇久久久久久| 亚洲激情视频在线播放| 91久久中文字幕| 成人黄色影片在线| 国产精品美女免费看| 亚洲欧美日韩中文视频| 久久久国产精品免费| 日韩成人激情影院| 97av在线视频免费播放| 国产成人一区二区在线| 精品小视频在线| 成人免费大片黄在线播放| 中文字幕九色91在线| 日韩精品999| 久久乐国产精品| 亚洲国产高潮在线观看| 精品国模在线视频| 疯狂做受xxxx高潮欧美日本| 国产成人精品视频在线| 成人高清视频观看www| 亚洲国产高清福利视频| 欧美专区在线观看| 日韩精品极品视频免费观看| 国产噜噜噜噜噜久久久久久久久| 欧美疯狂xxxx大交乱88av| 亚洲精品自在久久| 亚洲国产欧美一区二区三区久久| 亚洲一区www| 国产精品亚洲欧美导航| 国产成人免费av| 欧美亚洲国产另类| 亚洲精品少妇网址| 日韩精品免费在线视频| 欧美韩国理论所午夜片917电影| 97久久超碰福利国产精品…| 久久精品亚洲一区| 欧美日本国产在线| 欧美大片欧美激情性色a∨久久| 久久久www成人免费精品张筱雨| 国产日韩欧美电影在线观看| 在线观看免费高清视频97| 国产精品午夜一区二区欲梦| 欧美日韩中文字幕| 欧美又大粗又爽又黄大片视频| 亚洲欧美国产制服动漫| 亚洲一级片在线看| 久久精品国产综合| 久久久久久久成人| 韩国国内大量揄拍精品视频| 亚洲成人999| 久久影视电视剧免费网站| 久久久国产一区二区三区| 日韩中文在线观看| 欧美性69xxxx肥| 亚洲第一精品久久忘忧草社区| 日韩欧美视频一区二区三区| 日韩中文字幕在线看| 国产日韩精品综合网站| www.99久久热国产日韩欧美.com| 欧美黑人一级爽快片淫片高清| 精品中文字幕在线2019| 午夜精品久久久久久久男人的天堂| 久久精品国产久精国产一老狼| 国产精品中文字幕久久久| 欧美日韩国产专区| 亚洲精品久久久久中文字幕二区| 国产精品99蜜臀久久不卡二区| 精品亚洲夜色av98在线观看| 欧美国产日韩一区二区在线观看| 91免费高清视频| 91日本在线视频| 国产日韩欧美黄色| 亚洲xxx自由成熟| 国产91成人video| 国产一区二区三区在线视频| 狠狠躁夜夜躁人人爽天天天天97|