如何安排Laravel 5作业从外部JSON文件获取数据,并将值存储在数据库中?

时间:2018-01-03 20:49:02

标签: json laravel

我目前正在Laravel的一个项目上工作,我想安排一个从外部API(JSON文件)获取价值(比特币的价格)的工作,并且每隔几分钟就将这个值存储在我的数据库中。

到目前为止,我使用artisan命令创建了一个作业:artisan make:job UpdateBitcoinMarketPrice。但是我不知道要在我创建的Job类的public function handle()中包含什么。

我已经知道我可以使用以下功能定期从App\Console\Kernel.php拨打这份工作:

protected function schedule(Schedule $schedule){ // $schedule->command('inspire') // ->hourly(); $schedule->job(new UpdateBitcoinMarketPrice)->everyFiveMinutes();}

例如,我应该创建一个存储所述值的新模型吗?然后每次运行时创建一个新的对象?

如果我希望返回值,我应该调用数据库的第一行吗?

1 个答案:

答案 0 :(得分:0)

作业类非常简单,通常只包含一个handle()方法,该方法在队列处理作业时调用。您可以使用构造函数注入任何参数或序列化模型,以便在handle方法中使用它。

因此,为了保持粗体,您可以对handle方法进行api调用,并将响应存储在数据库中。知道这会将api调用作为后台工作。

有些事情:

    public function __construct(User $user)
    {
         //In this case Laravel serilizes the User model example so you could use it on your background job. 
         //This can be anything that you need in order to make the call
        $this->user = $user;
    }

    //Injecting as an example ExtrernalServieClass or Transformer(to transform api response).
    public function handle(ExternalServiceClass $service, Transformer $transform)
    { 

         //Here you can make the call to the api. 

         //Get the response parse it 

         // Store to database 

         $response = $service->postRequest($someUri, $someParams);

         $parsedResponse = $transform->serviceResponse($response);

         DatabaseModel::firstOrCreate($parsedResponse);

    }

}

队列处理作业时调用handle方法。请注意,您可以在作业的handle方法上键入提示依赖项,如上例所示。 Laravel服务容器自动注入这些依赖项。

现在,由于您要运行作业everyFiveMinutes(),因此如果默认情况下未完成上一个作业,则即使先前的任务实例仍在运行,也会运行计划任务。

为防止这种情况,您可以使用withoutOverlapping方法:

$schedule->job(new UpdateBitcoinMarketPrice)->everyFiveMinutes()->>withoutOverlapping();