编程学习网 > PHP技术 > laravel > 以laravel为框架进行用户动态模块化开发
2021
08-02

以laravel为框架进行用户动态模块化开发

用户动态画像是对可能用户的描述,其本质是创造用户。其设计思维特征是:克服用户表层差异去寻找深层普遍性、基于设计判断力的预见性、户画像的可迭代性。其描述方法包括三个层面:信仰层面的潜在用户画像、同理心层面的可能用户画像、设计流程层面的临时用户画像。而几乎所有的社区应用都有用户动态这个部分,用户可以通过好友动态获能取到更多感兴趣的内容,从而提高社区活跃度和用户粘性。它的实现相对来讲比普通的内容发布要复杂一些,主要体现在内容多样性上。


为了解决这个问题,我们得把这些不同类型的内容抽象,提取共性,使用相同的结构来处理,用laravel框架开发


怎么展示

1.我们的动态展示需求通常有以下几种:

2.我的好友的动态

3.某个人的动态,通常是个人中心

4.全部动态,比如 laravel China 首页的全部动态

5.动态搜索,比较少见

我最近正在开发 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');  

 

$activity = Activity::all()->last();

$activity->subject; //returns an instance of an eloquent model

$activity->causer; //returns an instance of your user model

$activity->getExtraProperty('customProperty'); //returns 'customValue'

$activity->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 模型事件来监听模型的变化,当各种模型事件创建的时候我们调用对应的方法来记录动态,所以实现起来非常的方便。

以上就是“以laravel为框架进行用户动态模块化开发”的详细内容,想要获取更多laravel教程欢迎关注编程学习网

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取