Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 根据用户首选项创建通知系统_Mongodb_Laravel_Push Notification_Notifications_Laravel Notification - Fatal编程技术网

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

我正在尝试开发一个通知系统,但我不确定我是否正确地完成了某些部分。为了简化案例,我将使用一些通用命名

系统应如何工作:

  • 注册用户可以根据从数据表网格中选择的过滤器订阅通知。(例如,当项目的数量为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.quantity”;a:1:{s:4:$gte;i:1;}”

    简化生成

    $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通知:

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

  • 创建通知
  • php artisan make:notification UserUpdateQuantity
  • 使用户模型成为可通知的,也创建订阅某些内容的范围
  • 创建事件和侦听器
  • 您可以在这里找到事件和侦听器

    在EventServiceProvider中

    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);
        }
    }