Ларавель - Превратить часть функции в оператор в очереди
Я хочу поставить в очередь часть функции в моем контроллере, главным образом потому, что он обращается к стороннему 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)
{
}
Но я не уверен, как все изложить! Любое руководство было бы чрезвычайно оценено.
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.