Yii2: Могу ли я создать правила и пользовательские сообщения об ошибках, которые применяются при УДАЛЕНИИ модели? - PullRequest
1 голос
/ 08 марта 2019

Я хочу удалить модель, но она может иметь связанные записи в другой модели, когда мне будет запрещено это делать.Как лучше всего использовать уже определенные отношения, чтобы проверить, будет ли удаление успешным?Потенциально могут также быть причины отсутствия отношений для запрета удаления.

После того, как я определил свои сообщения об ошибках, как я могу лучше сохранить их и передать их внешнему интерфейсу?beforeDelete() возвращает только true или false, но мне, конечно, нужно предоставить пользователю дружественные сообщения об ошибках, в которых говорится, ПОЧЕМУ запись не может быть удалена ...

Например, уже определена связь:

public function getPhonenumbers() {
    return $this->hasMany(Phonenumber::class, ['ph_contactID' => 'contactID']);
}

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Из ответов @vishuB и @ rob006 у меня появились идеи для создания собственного решения, которое, я думаю, будет лучше, поскольку я могу предоставить несколько сообщений об ошибках, его можно использовать и в API, и это не так.не полагайтесь на попытки / перехват исключений:

public function beforeDelete() {
    if (!parent::beforeDelete()) {
        $this->addError('contactID', 'For some unknown reason we could not delete this record.');
    }

    if (!empty($this->phonenumbers)) {
        $this->addError('contactID', 'Contact is linked to a used phone number and cannot be deleted.');
    }

    if ($some_other_validation_fails) {
        $this->addError('contactID', 'Contact cannot be deleted because it is more than two months old.');
    }

    return ($this->hasErrors() ? false : true);
}

Затем в своем действии я делаю это:

$contact = Contact::findOne($contactID);
if (!$contact->delete()) {
    return $contact->getErrors();  //or use flash messages and redirect to page if you prefer
}
return true;
1 голос
/ 08 марта 2019

Вы можете выдать исключение в beforeDelete() с сообщением об ошибке и перехватить его в контроллере.

public function beforeDelete() {
    if ($this->getPhonenumbers()->exist()) {
        throw new DeleteFailException('Records with phone numbers cannot be deleted.');
    }

    return parent::beforeDelete();
}

И в действии контроллера:

try {
    $model->delete();
} catch (DeleteFailException $esception) {
    Yii::$app->session->setFlash('error', $exception->getMessage());
}
...