Я написал контроллер, который вот что делает:
Когда пользователь пишет в URL-адресе город Лондон:
http://mysitename/weather/London
Веб-сайт api.openweathermap.org предоставляет данные с помощью API, и пользователь получает данные о погоде в Лондоне на странице:
Контроллер 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());
}
}
}
?>
Но это не помогло и та же ошибка отображается.