Mongodb 根据用户首选项创建通知系统
我正在尝试开发一个通知系统,但我不确定我是否正确地完成了某些部分。为了简化案例,我将使用一些通用命名 系统应如何工作:Mongodb 根据用户首选项创建通知系统,mongodb,laravel,push-notification,notifications,laravel-notification,Mongodb,Laravel,Push Notification,Notifications,Laravel Notification,我正在尝试开发一个通知系统,但我不确定我是否正确地完成了某些部分。为了简化案例,我将使用一些通用命名 系统应如何工作: 注册用户可以根据从数据表网格中选择的过滤器订阅通知。(例如,当项目的数量为X时通知我,或者设置多个过滤器,如set1.slug.quantity>X,some_value=false,some_int=52) 如何存储这些首选项: 示例对象 O:8:“标准类”:2:{s:9:$set1.slug;a:1:{s:3:$eq;s:10:'item_slug1;}s:13:'set1
$object=new\stdClass();
$object->{'set1.slug'}=['eq'=>'item_slug1'];
$object->{'set1.quantity'}=['$gte'=>1];
$object=序列化($object);
它还将用户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 |
+----+-----------------------------------------------------------------------------------------------------------------+---------+----------------------------------+
这就是我将如何使用它——我对它如何工作的看法。
在填充表项时,我将在循环中调用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调用
我愿意接受任何建议和重新设计。我开发了一款类似这样的应用程序。我的方法是利用此处的Laravel通知: 比方说,在您的情况下,如果有人修改/创建数据,其他订阅的用户将收到通知
protected$listen=[
'App\Events\QuantityUpdated'=>[
'App\Listeners\SendUpdateQuantiryNotification',
],
];
然后运行命令php artisan event:generate
公共函数句柄(QuantityUpdate$event)
{
$subscriber=User::subscribe()->get();
通知::发送($subscriber,new UserUpdateQuantity());
}
//在您的模型中
受保护的$dispatchesEvents=[
'updated'=>App\Events\QuantityUpdated::class
];
我会尝试一下,然后回击您
<?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);
}
}