我有一个Laravel应用,其中列出了旅行及其价格。
我希望价格根据用户的IP地址以其本国货币显示。
目前,我在模型中有以下代码:
// Guzzle call to external api that returns exchange rates JSON
$response = $client->request('GET','http://www.floatrates.com/daily/usd.json');
//$userCurrency would be something like "EUR"
$rate = json_decode($response->getBody()->getContents())->$userCurrency->rate;
// I multiply exchange rate with the USD price to get price in local currency
$priceInLocalCurrency = $usdPrice * $rate;
// return price in local currency
return $priceInLocalCurrency;
到目前为止,效果很好,但是由于在返回的每个模型实例上调用外部API的过程非常缓慢。这就解释了旅行人数缓慢的原因。
我已经看到了有关如何通过将变量(或api调用响应)放在BaseController
中来使所有控制器均可访问该变量的答案:
https://stackoverflow.com/a/25194280/10278170
我的目标是相似的,但要使变量可用于所有模型实例。因此,外部API仅被调用一次。
与控制器模型不同,它扩展了这一点:
use Illuminate\Database\Eloquent\Model;
哪个位于供应商内部,所以我无法在其中添加内容。