사용자 동적 모듈 개발을 구현하는 Laravel의 예 공유

黄舟
풀어 주다: 2023-03-16 11:04:02
원래의
1254명이 탐색했습니다.

이 글은 주로 Laravel을 기반으로 한 사용자 동적 모듈 개발에 대한 관련 정보를 소개하며, 샘플 코드를 통해 이를 매우 자세하게 소개합니다. 학습이나 작업이 필요한 모든 사람이 따라할 수 있는 학습 가치가 있습니다. 아래에 오셔서 저와 함께 배워보세요.

머리말

거의 모든 커뮤니티 애플리케이션에 사용자 업데이트 섹션이 있다는 사실은 모두가 알고 있을 것입니다. 사용자는 친구 업데이트를 통해 더 흥미로운 콘텐츠를 얻을 수 있으므로 커뮤니티 활동과 사용자 충성도가 높아집니다. 구현은 주로 콘텐츠의 다양성에 반영되는 일반 콘텐츠 게시보다 상대적으로 더 복잡합니다.

이 문제를 해결하려면 이러한 다양한 유형의 콘텐츠를 추상화하고, 공통점을 추출하고, 동일한 구조를 사용하여 처리해야 하므로 개발이 훨씬 간단해집니다.

개념 추상

사용자 역학은 이름에서 알 수 있듯이 역학의 생성은 일련의 이벤트에 대한 역사적 기록이므로 먼저 "이벤트"라는 용어와 그것이 갖는 속성에 주의를 기울이십시오.

  • 커뮤니티를 기반으로 한 트리거 거의 모든 이벤트는 사용자에 의해 트리거됩니다.

  • 이벤트 본문, "xxx가 기사를 게시했습니다"의 "기사"와 같은 이벤트의 주요 정보입니다.

  • 이벤트 속성, 이벤트 주제에 따라 이벤트 유형과 같은 다양한 추가 정보가 필요합니다.

  • 발생 시간, 이벤트가 발생한 시간을 기록합니다. 물론 우리 데이터베이스는 일반적으로 모든 데이터가 생성되는 시간을 기록합니다.

우리는 구현하기 더 쉬운 4가지 기본 속성만 있는 구조로 사용자 역학을 추상화합니다.


- description    事件描述
- causer_id 或者 user_id 事件触发者
- subject_id    主体 ID
- subject_type   主体类型
- properties    事件附加属性
- created_at    事件产生时间
로그인 후 복사

주요 부분은 Laravel의 다형성 관계인 모프 관계입니다.

표시 방법

동적 디스플레이 요구 사항에는 일반적으로 다음이 포함됩니다.

  • 내 친구의 역학

  • 누군가의 역학, 일반적으로 개인 센터

  • 모든 역학, 예를 들어 모두 Laravel China 홈페이지의 역학

  • 동적 검색은 상대적으로 드뭅니다.

저는 현재 사용자 역학도 포함하는 EasyWeChat 웹사이트의 새 버전을 개발 중입니다. 예:


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
로그인 후 복사

Recorddynamics

$ 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿