2015-02-20 12 views
6

Ho un codice che è stato interrotto da qualche parte lungo il percorso e sto riscontrando problemi nel debugarlo.Debugging save() return false CakePHP 3.0

Questa è una versione semplificata di esso.

$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 
} 

sono lasciato pianto e stridore dei denti senza errori, per quanto posso vedere se il debug i dati $ sembra che va bene (anche se dal momento che è abbastanza lungo e contiene una serie di UUID è possibile Mi manca qualcosa).

Gli errori di convalida sono vuoti.

Il salvataggio sta tornando falso - qualsiasi suggerimento su come eseguire il debug di questo potrebbe salvare il buon senso che mi è rimasto.

Grazie!

+0

Quando si sta dicendo "errori _Validation è empty_", come si fa a controllare che? _Dopo_ il salvataggio in modo da includere possibili errori delle regole della tabella? – ndm

+0

La vista è renderizzata e usando il kit di debug mostra la convalida per 'form' come vuoto –

+0

Quindi suggerirei di scavare nel core source di CakePHP per eseguire il debug del flusso di controllo che ha origine dalla chiamata 'Table :: save()'. – ndm

risposta

14

Il problema si è rivelato essere i dati, come previsto, ma non è stato possibile visualizzare immediatamente perché il salvataggio restituiva false e i dati erano piuttosto grandi.

ho fatto un sottoinsieme dei dati problema che ha mostrato lo stesso comportamento poi, seguendo il suggerimento di NDM, cambiato il codice/Table.php ORM per la funzione di salvataggio come segue per essere in grado di vedere dove il problema era:

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

Così ho potuto vedere cosa stava succedendo e ho continuato a correggere i dati.

+0

Ricco - questo è geniale. Funziona come un fascino. C'è un modo per implementare questo superando la classe Table nel codice dell'app, invece di modificare il core? Grazie. –

1

Non sono sicuro che la risposta precedente sia basata su una versione precedente, ma nell'ultima versione di cakephp (3.4) è possibile recuperare gli errori direttamente dall'entità $ all'interno del controller. L'array errors contiene ogni campo entità che ha avuto esito negativo, con un array figlio di convalide non riuscite.

<?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()); 
    } 
0

invece modificare il codice torta di base si può fare questo:

if ($this->Forms->save($form)) { 
    // sunshine and rainbows 
} else { 
    //you know now what fail 
    $andTheErrorsAre = $entity->getErrors(); 
}