2015-02-20 10 views
6

Ich habe einige Code, der auf dem Weg irgendwo gebrochen und ich habe Probleme es Debuggen mit.Debuggen speichern() false zurückgibt CakePHP 3.0

Dies ist eine vereinfachte Version davon.

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

Ich bin links Heulen und zähneknirschend ohne Fehler, soweit ich, wenn ich die $ Daten sieht es sieht debuggen wie es in Ordnung ist (obwohl, da es ziemlich lang ist und eine Reihe von UUIDs enthält es möglich ist, Ich vermisse etwas).

Validierungsfehler ist leer.

Das Speichern kehrt falsch - irgendwelche Vorschläge, wie dies debuggen könnte retten, was Verstand ich noch habe.

Danke!

+0

Wenn Sie sagen „_Validation Fehler empty_“, wie Sie das überprüfen Sie? _nach_Speichern, so dass mögliche Tabellenregelfehler enthalten sind? – ndm

+0

Die Ansicht wird gerendert und mit dem Debug-Kit wird die Validierung für 'form' als leer angezeigt. –

+0

Dann würde ich vorschlagen, in die CakePHP-Kernquelle zu graben, um den Kontrollfluss aus dem 'Table :: save() 'Aufruf zu debuggen. – ndm

Antwort

14

Das Problem stellte sich heraus, die Daten zu sein, wie erwartet, konnte aber nicht sofort sehen, weil das Speichern falsch zurückkehrte und die Daten war recht groß.

Ich habe zunächst eine Teilmenge des Problems Daten, die das gleiche Verhalten dann angezeigt, Vorschlag folgende NDM ist, änderte sich die ORM/Table.php Code für die Funktion wie folgt speichern zu können, um zu sehen, wo das Problem war:

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

Damit konnte ich sehen, was los war und ging auf die Daten zu beheben.

+0

Rich - das ist brillant. Klappt wunderbar. Gibt es eine Möglichkeit, dies zu implementieren, indem Sie die Table-Klasse in Ihrem App-Code überschreiben, anstatt den Kern zu ändern? Vielen Dank. –

1

nicht sicher, ob die frühere Antwort auf einer älteren Version basiert, aber in der aktuellen cakephp Version (3.4) können Sie die Fehler direkt aus dem $ Einheit innerhalb des Controllers abzurufen. Das Fehlerarray enthält jedes Entitätsfeld, das fehlgeschlagen ist, mit einem untergeordneten Array fehlgeschlagener Validierungen.

<?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

Statt den Kern Kuchen Code ändern Sie dies tun können:

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