Исходя из комментария епископа, вы можете создать прокси-класс следующим образом:
class WeatherLibraryProxy
{
/**
* @var WeatherLibrary
*/
protected $driver;
public function __construct(WeatherLibrary $driver)
{
$this->driver = $driver;
}
/**
* Dynamically call the underlying api driver and cache all responses
*/
public function __call($method, $parameters)
{
$cache_key = $method . implode(',', $parameters);
$minutes = 60;
return cache()->remember($cache_key, $minutes, function () use ($method, $parameters) {
return $this->driver->$method(...$parameters);
});
}
}
Затем в вашем контроллере замените введенный WeatherLibrary
на ваш WeatherLibraryProxy
класс:
class WeatherController
{
public function show($place, WeatherLibraryProxy $api)
{
return $api->getWeatherFor($place);
}
}
Я думаю Сервисный контейнер Laravel автоматически внедрит WeatherLibrary в конструктор вашего прокси, но если этого не произойдет, вы можете сделать что-то подобное в вашем AppServiceProvider.php:
$this->app->bind(WeatherLibraryProxy::class, function ($app) {
return new WeatherLibraryProxy(
$app->make(WeatherLibrary::class)
// OR "new WeatherLibrary($arg1, $arg2, ...)", depending how it's initialized...
);
});
который сообщает Laravel, как разрешать WeatherLibraryProxy, когда это необходимо.
Подробнее об автоматическом впрыске: https://laravel.com/docs/5.7/container#automatic-injection
Теперь любые общие функции (например, проверка оставшихся ограничений скорости) могут быть добавлены в вашПрокси-класс, который вы используете везде в своем приложении вместо базового класса WeatherLibrary.