2010-12-09 2 views
1

Ich verwende einige abstrakte Modellklassen von Zend.Zend Framework's Model Abstract und Nullwerte

  • Default_Model_Abstract: enthält __set und __get sowie einen Setter und Getter für jeden Wert und funktioniert als virtuelles Objekt.
  • Default_Model_AbstractMapper: enthält Methoden wie save(), find(), fetchall() und so weiter.
  • Ich habe diese Lösung vor einigen Monaten in der Zend Quick Start Dokumentation gefunden Aber in den letzten Monaten hatte ich einige Probleme mit Nullwerten.

    Ich habe ein Zend_Form_Element_Select Element, das seinen Wert aus der Datenbank bekommen hat. Die Werte sind IDs aus einem Fremdschlüssel. Daher wird nur eine gültige Fremdschlüssel-ID oder Null akzeptiert. Aber das Zend_Form_Element_Select-Element ist optional, daher ist es möglich, dass ich eine leere Zeichenfolge als Ergebnis bekomme (-> addMultiOption (null, 'Wähle deine Option')). Aber das wird mir einen Fehler geben, weil eine leere Zeichenfolge keine gültige Fremdschlüssel-ID ist, weder eine Null, die ebenfalls erlaubt wäre.

    Mein erster Versuch war, meinen Controller, der das Formular behandelt, einzuchecken, wenn der select-Elemente-Wert eine Eingabezeichenfolge-Zeichenfolge ist, und ändern Sie es in null. Das ist hässlich und das Problem war, dass mein Setter Null zu 0 änderte, weil ich es mit (int) $ value validiere.

    public function setId($value) 
    { 
        $this->_id = (int) $value; 
        return $this; 
    } 
    

    So war ein weiterer Ansatz, dass ich in meinem Setter zu überprüfen, wenn der Wert null ist und dann mit ich bestätige es nicht (int). Das würde ungefähr so ​​aussehen.

    public function setId($value) 
    { 
        if($value !== null) 
         $this->_id = (int) $value; 
        return $this; 
    } 
    

    Dies würde fr diesem Fall arbeiten, aber ich nicht sinnvoll, weil manchmal möchte ich so einen vorhandenen Wert auf Null zurückgesetzt. Daher kann ich Werte mit null im Setter nicht ignorieren. Also ein anderer Ansatz wäre:

    public function setId($value) 
    { 
        if($value !== null) 
         $this->_id = (int) $value; 
        else 
         $this->_id = null; 
        return $this; 
    } 
    

    Aber jetzt wird es wirklich hässlich. Ich bin gespannt, wie Sie dieses Problem lösen könnten. Weil ich denke, dass es eine einfache Lösung geben muss, ohne nur (int) im Setter zu entfernen. Denn soweit ich das gesehen habe, scheint dies ein üblicher Weg zu sein, den Setter zu benutzen.

    Mit freundlichen Grüßen, Nico

    +0

    Es ist keine Antwort auf Ihre __set oder __get Problem, aber Sie könnten in der Steuerung mit if (trim ($ yourselect) == '') $ yourselect = null; ? – Ashley

    Antwort

    1

    Ich kann nicht glauben, der auf andere Weise diese Logik weise zu tun. Wenn Sie dies zu ausführlich finden, können Sie if/else in einen ternären Operatorausdruck umwandeln. Dies würde es zu einem One-Liner machen.

    $this->_id = ($value !== NULL) ? (int) $value : NULL; 
    return $this; 
    

    Eine andere Möglichkeit wäre, Ihre if/else in einem benutzerdefinierten Zend_Filter wie NullOrInt zu bewegen. Dies könnte überall dort wiederverwendet werden, wo Sie diese Überprüfung benötigen, z. auf der Controller-Ebene zu validieren Anfrage Eingang oder in einem Zend_Form oder in Ihrem Setzer, etc.

    +1

    Das ist eine großartige Lösung, danke Gordon. Ich werde einen Validator verwenden, damit ich alle "Intelligenz" dem Formular überlassen kann und mich nicht mehr um Controller oder Modell kümmern muss. – Nico