【问题标题】:Laravel - One notification for all usersLaravel - 给所有用户的一个通知
【发布时间】:2018-04-02 07:48:03
【问题描述】:

我有使用 laravel 的社交网络网站。当为特定用户设置通知时,我的通知系统运行良好。但是假设一个用户成为版主,我想通知所有用户该事件有没有办法做到这一点而不向所有用户插入相同的通知?

我想到的一个解决方案是

我正在考虑将通知 user_id 设置为 0,这表明它适用于所有用户,顺便说一下,我不希望 read_at 属性在这种通知所以不需要另一个带有 FK 的表,所以如果这可以成为解决方案,那么如何插入它以及如何沿着用户的通知关系检索它们

【问题讨论】:

  • 一些关于您当前通知系统如何工作的代码可能会有所帮助。这可能只是确定一种将通知标记为广播的方式,而不是旨在传达给特定用户的方式

标签: php mysql laravel laravel-notification


【解决方案1】:

您可以简单地使用Notification Facade。您可以像这样获取所有用户并向他们发送通知,

$users = Users::all();
Notification::send($users, new MyNotification($param));

你需要像这样使用调用通知门面

use Illuminate\Support\Facades\Notification;

【讨论】:

  • 但是如果你有很多用户,那么选择所有这样的用户会让事情变得非常糟糕:)
【解决方案2】:

如果你想通知很多用户,你可以遍历所有用户使用queues

如果您只想一次发送大量电子邮件,请使用one of the available packages,它使用邮件服务 API 直接发送大量电子邮件,而不是逐个发送。

如果您想向所有使用您应用的当前用户广播事件,请使用Laravel Broadcasting 功能。你想要的是使用公共频道。

事件通过“频道”广播,可以指定为公共或私人。您的应用程序的任何访问者都可以订阅公共频道而无需任何身份验证或授权。

https://laravel.com/docs/5.5/broadcasting#concept-overview

【讨论】:

  • 我不想要电子邮件通知,这是一个数据库通知,可以简化我猜的情况
  • @ModySharf 数据库通知到底是什么意思?
  • 我的意思是它不会通过电子邮件发送,只会存储在数据库中
  • @ModySharf 因此,您可以使用insert() 方法为每个用户创建一条记录。它可以通过一次查询插入数千条记录。
  • 实际上,即使相同,您也需要为每个用户插入一条记录,因为无法确定何时隐藏给定用户的通知,但如果通知只是没有数据库的简单广播然后只是广播它@ModySharf。
【解决方案3】:

我遇到了和你一样的问题,并使用了user_id0的相同方法,表示它适用于所有关注者。一个通知只与数据一起插入,并且设置了一个额外的 subnotifications 表来保存对每个关注者的通知 ID 的引用,而不重复数据。

在此处查看完整的解决方案:Laravel 5.3 - Single Notification for User Collection (followers)

【讨论】:

    【解决方案4】:

    从 mysql 表中获取所有用户的 fcm 令牌

        $token_ids = Userdevices::pluck('fcm_token')->toArray();
        $this->send_admin_notification($token_ids,"title","body message","image url");
    

    向所有用户发送通知

    public function send_admin_notification($token_ids ,$title, $message,$imageURL){
        $authorization_key = "AAAADnklIkA:APA91...";
    
        $finalPostArray = array('registration_ids' => $token_ids,
                                'notification' => array('body' => $message,
                                                        'title' => $title,
                                                        "image"=> $imageURL),
                                "data"=> array("click_action"=> "FLUTTER_NOTIFICATION_CLICK",
                                                "sound"=> "default", 
                                                "status"=> "done")); 
        
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL,"https://fcm.googleapis.com/fcm/send");
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS,json_encode($finalPostArray));  //Post Fields
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Authorization: key='.$authorization_key));
        $server_output = curl_exec ($ch);
        curl_close ($ch);
        //echo $server_output; 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-05
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      相关资源
      最近更新 更多