Ларавель - Превратить часть функции в оператор в очереди


Я хочу поставить в очередь часть функции в моем контроллере, главным образом потому, что он обращается к стороннему API и вычисляет определенную информацию из указанного запроса. Я также хочу сделать это, чтобы расширить свои знания об очередях!

Код, который я хочу поставить в очередь:

Единственными переменными, которые потребуется нажать с помощью этого if statement, являются $postcode и $clinic ID (что показано выше инструкции).

if($clinic->postcode != $postcode)
    {

     $client = new Client([ 'base_uri' => 'https://api.postcodes.io/','timeout' => 2.0, 'verify' => false ]);
     $response = $client->get('postcodes/'.$postcode)->getBody();

     $input = json_decode($response);

     $clinic->latitude   = $input->result->latitude;
     $clinic->longitude  = $input->result->longitude;
     $clinic->save();
}

До сих пор я создал таблицу queue и перенес ее.

Я затем выполнил команду: php artisan make:job GetClinicLatAndLongPoints --queued

Мой вопрос в том, как я могу поместить эту функцию внутрь GetClinicLatAndLongPoints, включая передачу двух переменных для этого?

До сих пор у меня было:

public function handle(Clinic $clinic, $postcode)
    {

    }

Но я не уверен, как все изложить! Любое руководство было бы чрезвычайно оценено.

Author: peterm, 2015-06-22

1 answers

Вы можете передать экземпляр вашей модели Clinic и почтовый индекс конструктору вашей работы, который может выглядеть примерно так:

namespace App\Jobs;

use App\Clinic;
use App\Jobs\Job;
use GuzzleHttp\Client;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Queue\ShouldQueue;

class GetClinicLatAndLongPoints extends Job implements SelfHandling, ShouldQueue
{
    use InteractsWithQueue, SerializesModels;

    private $clinic;
    private $postcode;

    public function __construct(Clinic $clinic, $postcode)
    {
        $this->clinic = $clinic; // Laravel will automatically deserialize the model instance
        $this->postcode = $postcode;
    }

    public function handle()
    {
        $coordinates = $this->getCoordinates($this->postcode);

        if (! is_null($coordinates)) {
            // You may want to add error handling
            $this->clinic->latitude   = $coordinates['latitude'];
            $this->clinic->longitude  = $coordinates['longitude'];
            $this->clinic->save();
        }
    }

    private function getCoordinates($postcode)
    {
        $client = new Client(['base_uri' => 'https://api.postcodes.io/','timeout' => 2.0, 'verify' => false]);
        $response = json_decode($client->get('postcodes/'.$postcode)->getBody()->getContents());
        if (! $response || json_last_error() !== JSON_ERROR_NONE) {
            return null;
        }
        if ($response->status == 200 &&
            isset($response->result->latitude) &&
            isset($response->result->longitude)) {
            return [
                'latitude' => $response->result->latitude,
                'longitude' => $response->result->longitude
            ];
        }
        return null;
    }
}

В своем контроллере вы отправляете свою работу

if ($clinic->postcode != $postcode) {
    $this->dispatch(new GetClinicLatAndLongPoints($clinic, $postcode));
}

На заметку: хотя Laravel поставляется с драйвером очереди базы данных, использовать его в рабочей среде не очень хорошая идея. Лучше использовать одну из очередей заданий , т.Е. beanstalkd.

 0
Author: peterm, 2015-06-23 02:51:18