yaleksandr89 / weather
Package for retrieving current weather by coordinates
Requires
- php: ^8.4
- guzzlehttp/guzzle: ^8.0.1
- psr/http-client: ^1.0.3
- psr/http-factory: ^1.1.0
- psr/http-message: ^2.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.95.17
- phpstan/phpstan: ^2.2.6
- phpstan/phpstan-deprecation-rules: ^2.0.5
- phpunit/phpunit: ^13.2.5
This package is auto-updated.
Last update: 2026-08-26 14:57:37 UTC
README
Выберите язык
| Русский | English | Español | 中文 | Français | Deutsch |
|---|---|---|---|---|---|
| Выбран | English | Español | 中文 | Français | Deutsch |
Библиотека для получения текущей погоды по координатам через WeatherAPI и Open-Meteo. Данные разных сервисов приводятся к единому типизированному формату и общим единицам измерения.
Для чего нужен пакет
WeatherAPI и Open-Meteo используют разные HTTP API и форматы ответов. Weather даёт единый PHP API для получения текущей погоды по координатам, поэтому прикладному коду не нужно учитывать особенности конкретного сервиса.
Что делает пакет
- получает текущую погоду по широте и долготе;
- поддерживает WeatherAPI и Open-Meteo;
- возвращает результат в виде
CurrentWeather; - приводит погодные данные к единым метрическим единицам;
- предоставляет типизированные состояния погоды через
WeatherCondition; - позволяет подключить собственный источник данных через
CurrentWeatherProvider.
Требования
PHP ^8.4;Composer.
Быстрый старт
Установите пакет:
composer require yaleksandr89/weather
Open-Meteo
Для Open-Meteo API key не требуется.
use Yaleksandr\Weather\Config\OpenMeteoConfig; use Yaleksandr\Weather\Value\Coordinates; use Yaleksandr\Weather\Weather; $weather = Weather::create(new OpenMeteoConfig()); $current = $weather->current( Coordinates::fromDegrees(55.7558, 37.6173), ); echo $current->temperature()->celsius(); echo $current->condition()->value;
Показать реальный ответ Open-Meteo и CurrentWeather
Фрагмент реального ответа Open-Meteo
{
"time": 1786285800,
"interval": 900,
"temperature_2m": 21.8,
"relative_humidity_2m": 48,
"apparent_temperature": 20.4,
"precipitation": 0.0,
"weather_code": 1,
"pressure_msl": 1018.4,
"wind_speed_10m": 2.91,
"wind_direction_10m": 333,
"wind_gusts_10m": 8.1
}
Результат после преобразования
Yaleksandr\Weather\Model\CurrentWeather {
coordinates: Yaleksandr\Weather\Value\Coordinates {
latitude: 55.7558
longitude: 37.6173
}
observedAt: DateTimeImmutable {
date: 2026-08-09 14:30:00 UTC
}
temperature: Yaleksandr\Weather\Value\Temperature {
celsius: 21.8
}
condition: Yaleksandr\Weather\Value\WeatherCondition {
name: Clear
value: clear
}
feelsLike: Yaleksandr\Weather\Value\Temperature {
celsius: 20.4
}
humidityPercent: 48.0
pressureHectopascals: 1018.4
wind: Yaleksandr\Weather\Value\Wind {
speed: 2.91
directionDegrees: 333.0
gust: 8.1
}
precipitationMillimeters: 0.0
}
WeatherAPI
Для WeatherAPI нужен API key:
use Yaleksandr\Weather\Config\WeatherApiConfig; use Yaleksandr\Weather\Value\Coordinates; use Yaleksandr\Weather\Weather; $weather = Weather::create( new WeatherApiConfig('YOUR_WEATHERAPI_KEY'), ); $current = $weather->current( Coordinates::fromDegrees(55.7558, 37.6173), );
Замените YOUR_WEATHERAPI_KEY своим ключом. Не добавляйте реальный ключ в репозиторий: в приложении храните его вне исходного кода, например в конфигурации приложения, переменных окружения или хранилище секретов.
Показать реальный ответ WeatherAPI и CurrentWeather
Фрагмент реального ответа WeatherAPI
{
"last_updated_epoch": 1786290300,
"temp_c": 21.4,
"condition": {
"text": "Sunny",
"code": 1000
},
"wind_kph": 12.6,
"wind_degree": 341,
"pressure_mb": 1019.0,
"precip_mm": 0.0,
"humidity": 41,
"feelslike_c": 18.4,
"gust_kph": 15.8
}
Результат после преобразования
Yaleksandr\Weather\Model\CurrentWeather {
coordinates: Yaleksandr\Weather\Value\Coordinates {
latitude: 55.7558
longitude: 37.6173
}
observedAt: DateTimeImmutable {
date: 2026-08-09 15:45:00 UTC
}
temperature: Yaleksandr\Weather\Value\Temperature {
celsius: 21.4
}
condition: Yaleksandr\Weather\Value\WeatherCondition {
name: Clear
value: clear
}
feelsLike: Yaleksandr\Weather\Value\Temperature {
celsius: 18.4
}
humidityPercent: 41.0
pressureHectopascals: 1019.0
wind: Yaleksandr\Weather\Value\Wind {
speed: 3.5
directionDegrees: 341.0
gust: 4.3888888888889
}
precipitationMillimeters: 0.0
}
Оба провайдера возвращают CurrentWeather. Полный состав данных, единицы измерения, необязательные значения и примеры работы с объектом описаны в руководстве по CurrentWeather. Настройка встроенных сервисов и различия между ними — в руководстве по провайдерам.
Обработка ошибок
Ошибки входных данных отделены от ошибок, возникающих при обращении к погодному сервису.
Правила обработки и иерархия исключений описаны в руководстве по ошибкам.
Собственный провайдер
Если WeatherAPI и Open-Meteo не подходят, можно реализовать CurrentWeatherProvider и передать его напрямую:
use Yaleksandr\Weather\Weather; $weather = new Weather($customProvider);
Контракт и пример реализации приведены в руководстве по собственному провайдеру.
Ограничения
- поддерживается только текущая погода;
- координаты должны быть известны заранее;
- поиск города и геокодирование не выполняются;
- автоматического переключения между провайдерами нет;
- автоматические retry и cache не выполняются.
Обратная связь
- воспроизводимые ошибки — GitHub Issues.
Если пакет оказался полезен, поставьте звезду на GitHub — так его будет проще найти другим разработчикам. 🤘
