まず、これがLaravel5.3のデータベースベースのキュー内のジョブの形式であることに注意してください。 Laravelの新しいバージョンには変更が含まれています。
ペイロード列には、次の形式のjsonオブジェクトが含まれている必要があります。ジョブ(...\\[email protected]
)このシナリオではハードコーディングできます。 commandNameキーは表示目的のみであると思います。ただし、コマンドキーは難しい部分であり、unserialize()がサポートする有効なオブジェクトである必要があります。この目的のためにnpmで利用可能なパッケージがあるようですが、クイック検索でphp-serializationが見つかりました。
{
"job": "Illuminate\\Queue\\[email protected]",
"data": {
"commandName": "App\\Jobs\\MyJobClass",
"command": "O:19:\"App\\Jobs\\MyJobClass\"... /* stuff */"
}
}
指定したjsonペイロードは、次のオブジェクトになります。ジョブとデータキーの両方が重要です。
{
"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
}
問題のある部分は、シリアル化されたオブジェクトだと思います。読みやすい方法で再フォーマットされました(ただし、完全に壊れます)...
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;
}
この形式は、モデルへの参照をクラス+識別子を含む単純なエントリとして置き換えるSerializesModelsトレイトをジョブが使用し、__wakeup中にそれらを復元するという事実を明らかにします。
あなたの問題は、jsonの精神的な解析とシリアル化形式にあると思います。推測された構造は...間違っています。
次のステップは何も推測することではありません。すでにペイロードを持っているこの正確なテスト通知を複製します。コピーして貼り付けるだけです。 (IDを変更する必要があるかもしれません。重複排除に使用されると思います。)2。 php-serializationを使用してイベントデータを構築し、元のイベントペイロードと同じものを構築することを目指します。全く変化なし3。これまでに機能する場合は、シリアル化されたイベントデータを自由に変更して、何が起こるかを確認してください。