Отладка save(), возвращающая false CakePHP 3.0


У меня есть некоторый код, который сломался где-то по пути, и у меня возникли проблемы с его отладкой.

Это упрощенная версия.

$data = $this->request->data;

$form = $this->Forms->get($data['id'], [
    'contain' => ['FieldsForms' => ['data']
    ]
]);

$form = $this->Forms->patchEntity($form, $data,
    ['associated' => [
        'FieldsForms.Data',

    ]
]);

if ($this->Forms->save($form)) {
    // sunshine and rainbows
} else {
    // wailing and gnashing of teeth
}

Я остаюсь воющим и скрежещущим зубами без каких-либо ошибок, насколько я могу судить, если я отлаживаю данные $, похоже, что все в порядке (хотя, поскольку он довольно длинный и содержит кучу идентификаторов UUID, возможно, я что-то упускаю).

Ошибки проверки пусты.

Сохранение возвращает false - любые предложения о том, как отладка это может спасти то здравомыслие, которое у меня осталось.

Спасибо!

Author: Rich Hobbs, 2015-02-20

3 answers

Проблема оказалась в данных, как и ожидалось, но не смогла увидеть сразу, потому что сохранение возвращало false, а данные были довольно большими.

Сначала я создал подмножество проблемных данных, которые отображали то же поведение, а затем, следуя предложению ndm, изменил ORM/Table.php код для функции сохранения выглядит следующим образом, чтобы можно было увидеть, в чем заключалась проблема:

$x = $entity->errors();
        if ($x) {
            debug($entity);
            debug($x);
        // if ($entity->errors()) {
            return false;
        }

Чтобы я мог видеть, что происходит, и продолжал исправлять данные.

 15
Author: Rich Hobbs, 2015-02-23 13:46:34

Не уверен, что предыдущий ответ основан на более старой версии, но в последней версии cakephp (3.4) вы можете извлекать ошибки непосредственно из объекта $ в контроллере. Массив ошибок содержит каждое поле сущности, в котором произошел сбой, с дочерним массивом неудачных проверок.

<?php
// In Articles Controller
...

public function add(){
...
  if ($this->Articles->save($article)) {
    $this->Flash->success(__('The Article has been saved.'));
    return $this->redirect(['action' => 'index']);
  } else {
    Log::Debug($article->errors());
  }
 1
Author: Brad, 2018-03-02 13:08:54

Вместо изменения основного кода торта вы можете сделать следующее:

if ($this->Forms->save($form)) {
    // sunshine and rainbows
} else {
    //you know now what fail
    $andTheErrorsAre = $entity->getErrors();
}
 0
Author: Dino Moreira, 2018-02-16 22:28:23