Как сделать ответ на внешний вызов API доступным для всех экземпляров модели? - PullRequest
0 голосов
/ 23 марта 2019

У меня есть приложение 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;

, который находится внутри поставщика, поэтому я не могу добавлять что-либо вэто.

...