根据用户首选项创建通知系统

时间:2018-12-02 12:48:38

标签: mongodb laravel push-notification notifications laravel-notification

我正在尝试开发一个通知系统,但是我不确定我是否正确地执行了某些部分。 为简化起见,我将使用一些通用命名方式

系统应如何工作:

  1. 注册用户可以基于从数据表网格中选择的过滤器订阅通知。 (例如,当一件商品的数量为X时,请通知我,或者设置多个过滤器,如set1.slug.quantity> X,some_value = false,some_int = 52)

我如何存储此类首选项:

示例对象

“ O:8:” stdClass“:2:{s:9:” set1.slug“; a:1:{s:3:” $ eq“; s:10:” item_slug1“;} s: 13:“ set1.quantity”; a:1:{s:4:“ $ gte”; i:1;}}“

简化生成

$object = new \stdClass();
$object->{'set1.slug'} = ['$eq' => 'item_slug1'];
$object->{'set1.quantity'} = ['$gte' => 1];
$object = serialize($object);

它还将user_id和从表单序列化的所有数据附加到部分MongoDB原始查询。

数据库存储的对象-为用户预定义的过滤器集。 Md是对象的md5哈希,以便于访问和编辑。

+----+-----------------------------------------------------------------------------------------------------------------+---------+----------------------------------+
| id |                                                     object                                                      | user_id |                md                |
+----+-----------------------------------------------------------------------------------------------------------------+---------+----------------------------------+
|  1 | O:8:"stdClass":2:{s:9:"set1.slug";a:1:{s:3:"$eq";s:10:"item_slug1";}s:13:"set1.quantity";a:1:{s:4:"$gte";i:1;}} |      22 | d5003ba3227c4db3189827329815b053 |
+----+-----------------------------------------------------------------------------------------------------------------+---------+----------------------------------+

这就是我的使用方式-我对它如何工作的看法。

当填充表Items时,我会在API解析器中循环调用findByFilterMD。

// MongoDB query ( items database )
protected function executeUserFilter($array)
{
    $list = Items::raw(function ($collection) use (&$array) {
        return $collection->find(
            $array, ["typeMap" => ['root' => 'array', 'document' => 'array']])
            ->toArray();
    });

    return $list;
}

// MySQL query - stored filters
protected function findByFilterMD($id)
{
    $user = Auth::user();
    $filter = PredefinedFilters::where('md', '=', $id)->first();
    $deserialize = unserialize($filter->object);

    $results = $this->executeUserFilter($deserialize);
    // here would probably be a notification function like pusher or onesignal
}

我知道实现这一目标的尝试可能是完全错误的,我可能会重新发明轮子,因为某些工具可能已经做到了。

这是示例MongoDB对象

{
    "_id": {
        "$oid": "5c0406abdc04e7007f17f4ef"
    },
    "name": "myObject",
    "inner_ID": "0db0b19a-9c01-4c21-8e10-6879dbcb37f1",
    "some_value": false,
    "some_int": 52,
    "set1": [
        {
            "slug": "item_slug1",
            "quantity": 88,
            "extra": {
                "value": 0
            }
        },
    ],
    "set2": [
        {
            "slug": "item_slug2",
            "quantity": 88,
            "extra": {
                "value": 0
            }
        },
        {
            "slug": "item_slug3",
            "quantity": 88,
            "extra": {
                "value": 0
            }
        }
    ],
    "expires": "2018-12-02 22:21:30"
}

这是我的问题

  • 这种方法是否正确?
  • 通知系统应在哪里启动?我假设它可能位于我解析项目api的地方,那么我应该遍历用户过滤器数据并运行存储的对象查询-还是应该使用cron调用一个单独的系统?

我愿意接受任何建议,重新设计。

1 个答案:

答案 0 :(得分:0)

我开发了类似这样的应用。我的方法是利用在这里找到的Laravel通知: https://laravel.com/docs/5.7/notifications#creating-notifications

比方说,在您的情况下,如果有人修改/创建数据,则其他订阅的用户将收到通知。

  1. 创建通知
php artisan make:notification UserUpdateQuantity
  1. 使用户模型可通知,也创建可订阅内容的范围
<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    public function scopeSubscribe($query) 
    {
        return $query->where('subscribe', true);
    }
}

方法$query中的scopeSubscribe需要根据您的业务逻辑进行调整

  1. 发送通知
$subscriber = User::subscribe()->get();
Notification::send($subscriber, new UserUpdateQuantity());
  1. 创建事件和监听器

您可以在https://laravel.com/docs/5.7/events

处找到事件和侦听器

在EventServiceProvider中

protected $listen = [
    'App\Events\QuantityUpdated' => [
        'App\Listeners\SendUpdateQuantiryNotification',
    ],
];

然后运行命令php artisan event:generate

  1. 事件监听器

在事件监听器中,我们发送通知

public function handle(QuantityUpdated $event)
{
    $subscriber = User::subscribe()->get();
    Notification::send($subscriber, new UserUpdateQuantity());
}
  1. 口才事件

在雄辩的模型上添加事件,因此当某人更新数量时,它将触发事件,并且侦听器将向订阅的用户发送通知

// In your model
protected $dispatchesEvents = [
    'updated' => App\Events\QuantityUpdated::class
];