Знаю что вопрос уже много раз поднимался. Но найти решения пока не удалось.
Возьмем стандартный контроллер из примера:
public function actionContact()
{
$model = new ContactForm();
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
if ($model->sendEmail(Yii::$app->params['adminEmail'])) {
Yii::$app->session->setFlash('success', 'Thank you for contacting us. We will respond to you as soon as possible.');
} else {
Yii::$app->session->setFlash('error', 'There was an error sending your message.');
}
return $this->refresh();
} else {
return $this->render('contact', [
'model' => $model,
]);
}
}
С первого взгляда все хорошо. Внезапно ContactForm теперь может выбросить исключение. По умолчанию оно обрабатывается в отдельном контроллере если сайт на проде и на отдельной отладочной странице если на деве.
Внезапно понадобилось отображать сообщение прямо на странице ошибки. В данном случае /contact/.
В голову приходит такой код:
public function actionContact()
{
$model = new ContactForm();
try {
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
if ($model->sendEmail(Yii::$app->params['adminEmail'])) {
Yii::$app->session->setFlash('success', 'Thank you for contacting us. We will respond to you as soon as possible.');
} else {
Yii::$app->session->setFlash('error', 'There was an error sending your message.');
}
}
} catch (UserException $e) {
Yii::$app->session->setFlash('error', $e->getMessage());
} catch (\Exeption $e) {
Yii::$app->session->setFlash('error', 'Something went wrong.');
}
return $this->render('contact', [
'model' => $model,
]);
}
Код не проверял, но идея думаю понятна. С этим кодом есть проблема: я думаю что он не правильный. Да, можно вынести обработку исключений в базовый контроллер, но хочется узнать, как это сделать правильно с точки зрения yii.
Долгая работа с magento 2 заставила разобраться с исключениями. В ней они делаются
вот так.