3 Stimmen

Verhindern Sie, dass Propel leere Zeichenfolgen einfügt

Wie kann ich verhindern, dass Propel ORM leere Zeichenfolgen einfügt, wenn eine Spalte nicht festgelegt ist?

CREATE TABLE user (  
  uid INTEGER PRIMARY KEY AUTO_INCREMENT,  
  email VARCHAR(255) NOT NULL UNIQUE,  -- Kein Standardwert
  ...  
) Engine InnoDB ... ;  

Propel erlaubt $user = new User(); $user->save();. Ich habe versucht, SQL_MODE zu setzen, aber es hilft nicht.

2voto

Jordan Kasper Punkte 12612

Der richtige Weg, dies zu tun, besteht darin, einen Validator im Schema zu verwenden und dann mit der validate()-Methode in Ihrem Code zu überprüfen. Hier ist ein Beispiel:

    ...

    ...

Dann könnten Sie in Ihrem preSave()-Code etwas wie dies tun:

class User extends BaseUser {
  ...
  public function preSave(PropelPDO $con = null) {
    // besteht das Objekt alle Validierungen?
    if (!$this->validate()) {
      $errors = array();
      // etwas ist fehlgeschlagen, gehen Sie durch jedes Versagen und erfassen Sie die Meldung:
      foreach ($this->getValidationFailures() as $failure) {
        $errors[] = $failure->getMessage();
      }
      // durch das Werfen einer Ausnahme wird das Speichern gestoppt
      throw new InvalidArgumentException(implode("||", $errors));
    }

    return true; // wenn Sie hierhin gelangen, speichern Sie fort
  }
}

In Ihrem Skript würden Sie save() wie folgt aufrufen:

...
$user = new User();
try {
  // Versuchen Sie, zu speichern (könnte fehlschlagen)
  $user->save();

} catch (InvalidArgumentException $e) {
  // wir haben Fehler, splitten Sie die Ausnahmemeldung, um jede separat zu bekommen
  $errorMessages = preg_split(/\|\|/, $e->getMessage());
  // behandeln Sie die Meldungen, wie Sie müssen
}

Erfahren Sie mehr über Validators in der Propel-Dokumentation.

0voto

likeitlikeit Punkte 5465

Ich denke, du möchtest tatsächlich das Einfügen/Aktualisieren stoppen, wenn die email Spalte nicht gesetzt ist. Es gibt tatsächlich einen richtigen Weg, dies zu tun, und zwar durch Verwendung von Hooks.

Siehe den folgenden Code für ein Beispiel:

class User extends BaseUser
{
  // rest of code ...

  public function preSave(PropelPDO $con = null)
  {
    if ( empty($this->getEmail) ) {
        return false; 
    }
    return true;
  }
}

Sie können auch preInsert() oder preUpdate() verwenden, um mehr Kontrolle darüber zu haben, wann die Daten validiert werden sollen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X