У меня есть приложение 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;
, который находится внутри поставщика, поэтому я не могу добавлять что-либо вэто.