Задать вопрос
@aleksandrkotov

Какой код нужно добавить в контроллер, чтобы вместо ошибок отображалось сообщение «город не найден»?

Я написал контроллер, который вот что делает:

Когда пользователь пишет в URL-адресе город Лондон:
http://mysitename/weather/London
Веб-сайт api.openweathermap.org предоставляет данные с помощью API, и пользователь получает данные о погоде в Лондоне на странице:
61acdf2a77085778191044.png

Контроллер WeatherPage.php, реализующий это:

<?php
namespace Drupal\weather\Controller; 
use Drupal\Core\Render\Markup;
use Drupal\Core\Controller\ControllerBase; 
use GuzzleHttp\Client;

class WeatherPage {
  public function getWeather($city) {
    $client = \Drupal::httpClient();

    try {
      $response = $client->get('http://api.openweathermap.org/data/2.5/weather?q='.$city.',&appid=здесь_мойаппайди&units=metric');
      $response_data = $response->getBody();  
      $data = json_decode($response_data );  
      return [
        '#markup' => Markup::create(
                                     '<h1>'  . $data->name . '</h1>' . 
                                     '<div>' . 'Temperature: ' . round($data->main->temp). '°C' . '</div>' .
                                     '<div>' . 'Сloudiness: ' . $data->clouds->all. '%' . '</div>' .
                                     '<div>' . 'Humidity: ' . $data->main->humidity. '%' . '</div>' .
                                     '<div>' . 'Pressure: ' . $data->main->pressure. ' mm' . '</div>' . 
                                     '<div>' . 'Wind: ' . $data->wind->speed. ' m/sec' . '</div>' 
                                    )
      ];
    } 
    catch (RequestException $e) {
      watchdog_exception('weather', $e->getMessage());
    }
  }
}
?>


Но если пользователь вводит в URL неправильное название города, города которого не существует, например Londonnnn, отображается ошибка:

GuzzleHttp\Exception\ClientException: Client error: `GET http://api.openweathermap.org/data/2.5/weather?q=L...` resulted in a `404 Not Found` response: {"cod":"404","message":"city not found"} in GuzzleHttp\Exception\RequestException::create() (line 113 of /var/www/html/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php).


Это не хорошо. Пользователь не должен видеть ошибку когда он вводит в URL-адрес название несуществующего города, вместо этого он должен видеть на странице простое сообщение, например:

Город не найден

Чтобы решить эту проблему, я попытался добавить конструкцию `if-else` (возле строк которые я добавил я написал комментарии)
<?php

namespace Drupal\weather\Controller; 
use Drupal\Core\Render\Markup;
use Drupal\Core\Controller\ControllerBase; 
use GuzzleHttp\Client;

class WeatherPage {
  public function getWeather($city) {
    $client = \Drupal::httpClient();

    try {
      $response = $client->get('http://api.openweathermap.org/data/2.5/weather?q='.$city.',&appid=здесь_мойаппайди&units=metric');
      if ($response->getStatusCode() == '200') {              /*добавил эту строку*/
      $response_data = $response->getBody();  
      $data = json_decode($response_data );  
      return [
        '#markup' => Markup::create(
                                     '<h1>'  . $data->name . '</h1>' . 
                                     '<div>' . 'Temperature: ' . round($data->main->temp). '°C' . '</div>' .
                                     '<div>' . 'Сloudiness: ' . $data->clouds->all. '%' . '</div>' .
                                     '<div>' . 'Humidity: ' . $data->main->humidity. '%' . '</div>' .
                                     '<div>' . 'Pressure: ' . $data->main->pressure. ' mm' . '</div>' . 
                                     '<div>' . 'Wind: ' . $data->wind->speed. ' m/sec' . '</div>' 
                                    )
      ];
     } 
     else {                                                /*добавил эту строку*/
       echo "City not found";                   /*добавил эту строку*/
     }                                                     /*добавил эту строку*/
    } 
    catch (RequestException $e) {
      watchdog_exception('weather', $e->getMessage());
    }
  }
}
?>


Но это не помогло и та же ошибка отображается.
  • Вопрос задан
  • 160 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
402d
@402d
начинал с бейсика на УКНЦ в 1988
https://www.php.net/manual/ru/language.exceptions.php

try catch вместо if else

точнее в вашем коде там где вотчдог ловите. И выводите что город не найден
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы