Redis
 sql >> Database >  >> NoSQL >> Redis

Coda Push to Laravel dall'esterno di Laravel (NodeJS)

Innanzitutto, nota che questo è il formato dei lavori nella coda basata su database in Laravel 5.3. Le versioni più recenti di Laravel contengono modifiche.

La colonna del payload deve contenere un oggetto json del formato seguente. Il lavoro (...\\[email protected] ) può essere codificato in questo scenario. Credo che la chiave commandName sia solo a scopo di visualizzazione. Il tasto comando, tuttavia, è la parte più difficile, dovrebbe essere un oggetto valido supportato da unserialize(). Sembra che ci siano pacchetti disponibili su npm per questo scopo, una rapida ricerca ha portato alla serializzazione di php.

{
    "job": "Illuminate\\Queue\\[email protected]",
    "data": {
        "commandName": "App\\Jobs\\MyJobClass",
        "command": "O:19:\"App\\Jobs\\MyJobClass\"... /* stuff */"
    }
}

Il payload json che hai fornito risulta nel seguente oggetto. Sia il lavoro che le chiavi dati sono importanti.

{
  "job": "Illuminate\\Broadcasting\\BroadcastEvent",
  "data": {
    "event": "O:28:\"App\\Events\\NotificationEvent\":5:{s:7:\"\u0000*\u0000name\";s:12:\"notification\";s:4:\"data\";a:4:{s:4:\"testkey\";s:14:\"testval\";s:9:\"timestamp\";s:19:\"2017-02-24 11:07:48\";s:5:\"event\";s:12:\"notification\";s:5:\"class\";s:28:\"App\\Events\\NotificationEvent\";}s:10:\"\u0000*\u0000channel\";N;s:7:\"\u0000*\u0000user\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":2:{s:5:\"class\";s:8:\"App\\User\";s:2:\"id\";i:2;}s:6:\"socket\";N;}"
  },
  "id": "XuUKRTf8CTSdzaVgp2gRcvmxQqLcpBUG",
  "attempts": 1
}

La parte problematica, presumo, è l'oggetto serializzato. Riformattato in un modo che sia più facile da leggere (ma lo rompe totalmente) ...

O:28:"App\Events\NotificationEvent":5:{
    // protected $name = 'notification'
    s:7:" * name";s:12:"notification";

    // public $data = array(...)
    s:4:"data";a:4:{
        // 'testkey => 'testval'
        s:4:"testkey";s:14:"testval";

        // 'timestamp' => '2017-02-24 11:07:48';
        s:9:"timestamp";s:19:"2017-02-24 11:07:48";

        // 'event' => 'notification';
        s:5:"event";s:12:"notification";

        // 'class' => App\Events\NotificationEvent::class;
        s:5:"class";s:28:"App\Events\NotificationEvent";
    }

    // protected $channel = null;
    s:10:"\0*\0channel";N;

    // protected $user = (instance of ModelIdentifier)
    s:7:"\0*\0user";O:45:"Illuminate\Contracts\Database\ModelIdentifier":2:{
        // public $class = App\User::class;
        s:5:"class";s:8:"App\User";

        // public $id = 2;
        s:2:"id";i:2;
    }

    // public $socket = null;
    s:6:"socket";N;
}

Questo formato espone il fatto che il tuo lavoro utilizza il tratto SerializesModels che sostituisce i riferimenti ai modelli come una semplice voce contenente classe+identificatore e li ripristinerà durante il __wakeup.

Credo che il tuo problema sia con l'analisi mentale di json e il formato serialize; la tua struttura ipotizzata è... sbagliata.

I prossimi passi non sarebbero indovinare nulla.1. Duplica questa esatta notifica di prova per cui hai già il carico utile. Basta copiarlo e incollarlo. (Potrebbe essere necessario modificare l'ID, immagino sia utilizzato per la deduplicazione.)2. Crea i dati dell'evento utilizzando la serializzazione php e mira a creare qualcosa di identico al payload dell'evento originale. Nessun cambiamento a tutti.3. Se funziona fino a questo punto, sentiti libero di modificare i dati dell'evento serializzato per vedere cosa succede.