Как в Yii2 работать с исключениями в контроллере?

Знаю что вопрос уже много раз поднимался. Но найти решения пока не удалось.

Возьмем стандартный контроллер из примера:
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 заставила разобраться с исключениями. В ней они делаются вот так.
  • Вопрос задан
  • 1223 просмотра
Пригласить эксперта
Ответы на вопрос 2
@BorisKorobkov
Web developer
В конфиге указывается страница показа ошибки при exception
'components' => [
            'errorHandler' => [
                'errorAction' => 'site/error',
            ],
]

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

Form не должна бросать исключение. В случае неправильных входных данных надо возвращаться false в validate()

sendEmail() тоже не должна бросать исключений. Только return true/false
Ответ написан
@kuftachev
Или Вы как-то неоднозначно задаёте вопрос, или не совсем понимаете исключения.
Ответ написан
Ваш ответ на вопрос

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

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