2017-08-03 3 views
2

ich erfahre hier ein problem. Probe wird selbst dafür sprechen.laravel deserialize/entschlüsseln job rohen körper

Queue::after(function (JobProcessed $event) { 
$job_details = json_decode($event->job->getRawBody(), true); 

)}); 

Dies ist, wie $ job_details wie folgt aussieht:

'displayName' => 'App\\Jobs\\CommandJob', 
    'job' => 'Illuminate\\Queue\\[email protected]', 
    'maxTries' => 10, 
    'timeout' => NULL, 
    'data' => 
    array (
    'commandName' => 'App\\Jobs\\CommandJob', 
    'command' => 'O:19:"App\\Jobs\\CommandJob":9:{s:32:"' . "\0" . 'App\\Jobs\\CommandJob' . "\0" . 'commandName";N;s:30:"' . "\0" . 'App\\Jobs\\CommandJob' . "\0" . 'arguments";N;s:28:"' . "\0" . 'App\\Jobs\\CommandJob' . "\0" . 'command";s:20:"google:get-campaigns";s:5:"tries";i:10;s:32:"' . "\0" . 'App\\Jobs\\CommandJob' . "\0" . 'nextCommand";a:1:{i:0;s:19:"google:get-adgroups";}s:6:"' . "\0" . '*' . "\0" . 'job";N;s:10:"connection";N;s:5:"queue";s:11:"update_data";s:5:"delay";N;}', 

Ich möchte einige params von $ job_details erhalten [ 'data'] [ 'command']. Gibt es eine einfache Möglichkeit dies zu tun, oder brauche ich eine hausgemachte Lösung?

+0

ich das sehr ähnliches Problem bekam und versuchte, die PHP-serialize unserialize Methoden verwenden, aber scheint sie nicht mit dieser Methode serialisiert. –

Antwort

0

Die $job_details["data"]["command"] ist eine aus serialize($value) generierte Zeichenfolge. Sie können unserialize($str) erstellen, um das Jobobjekt zu erstellen, das von Ihrer Zeichenfolge dargestellt wird. Sie haben dann Zugriff auf die Eigenschaften gemäß den üblichen Sichtbarkeitsregeln.

$job = unserialize($job_details["data"]["command"]); 
dump($job->queue;) // "update_data" 
0

$event->job->getRawBody gibt einen String zurück, so dass Sie nicht $job_details['data']['command'] schreiben können, und Sie werden mit Illegal string offset error enden.

Ich verwende Laravel 5.4 und ich haben es geschafft, meine Job Instanz abrufen mit $event->job->payload() dann die unserialize Methode Anwendung der documentation nach.

Also, was ich tat, ist:

$payload = $event->job->payload(); 

    $myJob = unserialize($payload['data']['command']); 

    $myJob->getMyProperty(); 

    //... Just work with $myJob as if it were your job class