CakePHP 2.0 - настроить сообщение об ошибке базы данных - PullRequest
1 голос
/ 06 января 2012

У меня есть приложение CakePHP 2.0 с базой данных MySQL.Две таблицы базы данных связаны отношением 1: n и ограничением внешнего ключа.Поэтому, если я хочу удалить запись, которая связана с другой таблицей базы данных, я получаю сообщение об ошибке:

Error: SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a forein key constraint fails (...)
SQL Query: DELETE 'Test' FROM 'tests' AS 'Test' WHERE 'Test'.'id' = 10

Notice: If you want to customize this error message, create app/View/Errors/pdo_error.ctp

Но я хочу обработать сообщение об ошибке!Я читал кое-что о 'onError', но помещая его в 'AppModel', он, кажется, не вызывается (может, он работает только с CakePHP 1.3?):

class Test extends AppModel {
     function onError() {
         echo "TESTTESTTEST";
         $db = ConnectionManager::getDataSource('default');
         $err = $db->lastError();
         $this->log($err);
         $this->log($this->data);
     }
}

Так что я могу сделать?Я хочу остаться на этой странице и показать только сообщение об ошибке (не трассировка стека и тому подобное).

У кого-нибудь есть идея?

Ответы [ 2 ]

1 голос
/ 06 января 2012

Как насчет использования .ctp?

Если вы хотите настроить это сообщение об ошибке, создайте app / View / Errors / pdo_error.ctp

Тот, который используется, находится в Cakeкаталога, вы можете просто скопировать его в каталог app / View / Errors и удалить из него трассировку стека, если хотите.

Также есть функция обратного вызова beforeDelete () Model, которую вы можете использовать для установки flashMessage.

0 голосов
/ 29 августа 2016

Ошибка базы данных обычно дает ошибку 500, поэтому CakePHP обрабатывает исключение 500, используя только View / Errors / error500.ctp или app / View / Errors / pdo_error.ctp и настраивая эту страницу

и добавьте эту функцию нижев AppController.php

 function beforeRender() {
    if($this->name == 'CakeError') {
        $this->set('title','Internal error occurs');
        $this->layout = 'frontend';
    }
    }
...