Validate the API key and the city name by the API request

Аватар пользователя towi towi 11 апреля в 4:15

Я создал кастомный модуль, где в блоке отображаю погоду, используя данные из https://openweathermap.org/

Код этого блока:

https://phpsandbox.io/n/sweet-forest-1lew-1wmof

Также у меня есть файл WeatherForm.php с формой, которая добавляет в конфигурацию город и API-key, необходие чтобы отображать погоду.

Мне нужно было добавить проверку формы:
1. поля не должны быть пустыми
2. Название города не должно содержать цифр

Я сделал это следующим образом:

<?php  public function validateForm(array &$formFormStateInterface $form_state) {
    
$pattern '/[0-9]/';

    if (empty(

$form_state->getValue('weather_city'))) {
      
$form_state->setErrorByName('weather_city'$this->t('Fields should not be empty'));
    }
    if (
preg_match($pattern$form_state->getValue('weather_city'))) {
      
$form_state->setErrorByName('weather_city'$this->t('City name should not contain numbers'));
    }
  }
?>

Но я получил это замечание после code review:

Also, will be good to validate the API key and the city name by the API request.

Cуть замечания в том что нужно проверить, отвечает ли API key и City для сайта https://openweathermap.org/, тоесть подерживает сайт город(есть ли вообще для такого города данные о погоде, ведь пользователь может написать Fdjfjdf) который ввели в инпут, и отвечает ли API key доступу для OpenWeatherMap.
Пользователь вводит в инпуты город и api key и сразу летит запрос к OpenWeatherMap. И соотвественно в коде должна бить такая штука:

<?php$url = "https://api.openweather.org/data/2.5/weather?q=$city_name&appid=$api_key";
$response = $this->client->request('GET', $url); 
?>

Где например в $city_name должно попадать:
$form_state->getValue('weather_api_key')
Тоесть то что введено в форму. Также и для api key нужно сделать.

Я нашел пример как это реализовать:

<?php
public function validateWeatherData(string $city_name$api_key):bool {
  try {
    
$url "https://api.openweather.org/data/2.5/weather?q=$city_name&appid=$api_key";
    
$response $this->client->request('GET'$url);
    if (
$response->getStatusCode() != 200) {
      throw new \
Exception('Failed to retrieve data.');
    }
    
$reg_ex "#^[A-Za-z-]=$#";
    return 
preg_match($reg_ex$city_name);
  }
  catch (
GuzzleException $e) {
    return 
FALSE;
  }
}
?>

Но я не знаю, как интегрировать код примера в мою функцию validateForm. Подскажите пожалуйста как это сделать?

Весь код моей формы:

https://phpsandbox.io/n/spring-mountain-gdnn-emozx

Лучший ответ

Аватар пользователя zvse zvse 11 апреля в 9:43
1

Похоже на тестовое задание какое-то и, судя по всему, вы не совсем понимаете что делаете Smile

Будет примерно так.
https://phpsandbox.io/n/falling-wave-l6mv-rls2j

P.S. код я не проверял и не гарантирую его работоспособность, писал наобум без автокомплитов и прочих штук, которые обычно помогают писать без ошибок, поэтому нужно всё всё всё проверять
Добавил комментариев, чтобы было хоть чуть-чуть понятней.
Ну и - я бы на месте проверяющего спрашивал про каждую строчку кода, так что надо готовиться Smile

Комментарии

Аватар пользователя zvse zvse 11 апреля в 9:43
1

Похоже на тестовое задание какое-то и, судя по всему, вы не совсем понимаете что делаете Smile

Будет примерно так.
https://phpsandbox.io/n/falling-wave-l6mv-rls2j

P.S. код я не проверял и не гарантирую его работоспособность, писал наобум без автокомплитов и прочих штук, которые обычно помогают писать без ошибок, поэтому нужно всё всё всё проверять
Добавил комментариев, чтобы было хоть чуть-чуть понятней.
Ну и - я бы на месте проверяющего спрашивал про каждую строчку кода, так что надо готовиться Smile

Аватар пользователя towi towi 11 апреля в 10:55

Спасибо большое. Вы проделали большую работу! Я очень извиняюсь я наверное не правильно сформулировал вопрос, но суть замечания в том что нужно проверить, отвечает ли API key и City для сайта https://openweathermap.org/, тоесть подерживает сайт город(есть ли вообще для такого города данные о погоде, ведь пользователь может написать Fdjfjdf) который ввели в инпут, и отвечает ли API key доступу для OpenWeatherMap.
Пользователь вводит в инпуты город и api key и сразу летит запрос к OpenWeatherMap. И соотвественно в коде должна бить такая штука:

<?php$url = "https://api.openweather.org/data/2.5/weather?q=$city_name&appid=$api_key";
$response = $this->client->request('GET', $url); 
?>

Где например в $city_name должно попадать:
$form_state->getValue('weather_api_key')
Тоесть то что введено в форму. Также и для api key нужно сделать.

Понимание, что нужно сделать у меня уже нарисовывается, а вот как это кодом реализовать, здесь сложнее.

Аватар пользователя zvse zvse 12 апреля в 13:12

Обновил https://phpsandbox.io/n/falling-wave-l6mv-rls2j

Смысл в том, что мы читаем ответ и проверяем на наличие всего одного поля в ответе, возможно этого будет достаточно.
Нужно читать документацию и тестировать что я там понаписал, никакой уверенности нет.