搜尋
首頁後端開發php教程Laravel實作使用者動態模組開發的實例分享

Laravel實作使用者動態模組開發的實例分享

Sep 23, 2017 am 09:33 AM
laravel動態模組

這篇文章主要給大家介紹了關於基於Laravel實現的用戶動態模組開發的相關資料,文中透過範例程式碼介紹的非常詳細,對大家的學習或工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。

前言

相信大家都知道,幾乎所有的社群應用程式都有使用者動態這個部分,使用者可以透過好友動態來獲得更多感興趣的內容,從而提高社區活躍度和用戶黏性。它的實作相對來講比普通的內容發佈更複雜一些,主要體現在內容多樣性上。

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

概念抽象

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

  • 觸發者,基於社群所有的事件幾乎都是由使用者觸發的

  • 事件主體,事件的主體訊息,例如「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 = [
  &#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;);
 }
}

然後我們去註冊這個訂閱類別:

在App\Providers\EventServiceProvider 中$subscribe 中註冊這個訂閱類別:


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

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

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

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

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

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

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

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

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

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

总结

以上是Laravel實作使用者動態模組開發的實例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
解釋負載平衡如何影響會話管理以及如何解決。解釋負載平衡如何影響會話管理以及如何解決。Apr 29, 2025 am 12:42 AM

負載均衡會影響會話管理,但可以通過會話複製、會話粘性和集中式會話存儲解決。 1.會話複製在服務器間複製會話數據。 2.會話粘性將用戶請求定向到同一服務器。 3.集中式會話存儲使用獨立服務器如Redis存儲會話數據,確保數據共享。

說明會話鎖定的概念。說明會話鎖定的概念。Apr 29, 2025 am 12:39 AM

Sessionlockingisatechniqueusedtoensureauser'ssessionremainsexclusivetooneuseratatime.Itiscrucialforpreventingdatacorruptionandsecuritybreachesinmulti-userapplications.Sessionlockingisimplementedusingserver-sidelockingmechanisms,suchasReentrantLockinJ

有其他PHP會議的選擇嗎?有其他PHP會議的選擇嗎?Apr 29, 2025 am 12:36 AM

PHP會話的替代方案包括Cookies、Token-basedAuthentication、Database-basedSessions和Redis/Memcached。 1.Cookies通過在客戶端存儲數據來管理會話,簡單但安全性低。 2.Token-basedAuthentication使用令牌驗證用戶,安全性高但需額外邏輯。 3.Database-basedSessions將數據存儲在數據庫中,擴展性好但可能影響性能。 4.Redis/Memcached使用分佈式緩存提高性能和擴展性,但需額外配

在PHP的上下文中定義'會話劫持”一詞。在PHP的上下文中定義'會話劫持”一詞。Apr 29, 2025 am 12:33 AM

Sessionhijacking是指攻擊者通過獲取用戶的sessionID來冒充用戶。防範方法包括:1)使用HTTPS加密通信;2)驗證sessionID的來源;3)使用安全的sessionID生成算法;4)定期更新sessionID。

PHP的完整形式是什麼?PHP的完整形式是什麼?Apr 28, 2025 pm 04:58 PM

文章討論了PHP,詳細介紹了其完整形式,在We​​b開發中的主要用途,與Python和Java的比較以及對初學者的學習便利性。

PHP如何處理形式數據?PHP如何處理形式數據?Apr 28, 2025 pm 04:57 PM

PHP使用$ \ _ post和$ \ _獲取超級全局的php處理數據,並通過驗證,消毒和安全數據庫交互確保安全性。

PHP和ASP.NET有什麼區別?PHP和ASP.NET有什麼區別?Apr 28, 2025 pm 04:56 PM

本文比較了PHP和ASP.NET,重點是它們對大規模Web應用程序,性能差異和安全功能的適用性。兩者對於大型項目都是可行的,但是PHP是開源和無關的,而ASP.NET,

PHP是對病例敏感的語言嗎?PHP是對病例敏感的語言嗎?Apr 28, 2025 pm 04:55 PM

PHP的情況敏感性各不相同:功能不敏感,而變量和類是敏感的。最佳實踐包括一致的命名和使用對案例不敏感的功能進行比較。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)