我目前正在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();}
例如,我应该创建一个存储所述值的新模型吗?然后每次运行时创建一个新的对象?
如果我希望返回值,我应该调用数据库的第一行吗?
答案 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();