The truth is rarely pure and never simple

symfony: isNew() in einem Validator

Manchmal ist es hilfreich, auch in einem postValidator zu einem symfony-Formular zu wissen, ob der zugrundeliegende Eintrag neu ist oder ob es sich um eine Korrektur des Datensatzes handelt. Die Funktion sfForm::isNew() steht für einen Validator jedoch nicht zur Verfügung.

Zur Lösung gibt es zwei Ansätze, von denen der erste expliziter ist, weil das dazugehörige sfForm-Objekt analysiert wird, dafür ist die Lösung komplizierter und länger. Dazu wird erst die Datei lib/form/ExampleForm.class.php angepasst

[php]<?php
class ExampleForm extends BaseExampleForm {
public function configure() {
$this->validatorSchema->setPostValidator(new fsExampleValidator($this->isNew()));
}
}[/php]

Im Vergleich zur normalen Einbindung des Validators wurde lediglich ein neuer Parameter übergeben, der den Zustand des Formulars übergibt. Natürlich muss dieser Wert auch beim Validator interpretiert werden:

[php]<?php
class fsExampleValidator extends sfValidatorBase {
private $formIsNew;
function __construct($isNew) {
$this->formIsNew = $isNew;
parent::__construct();
}
protected function doClean($value) {
// if ($this->formIsNew) { … }
return $value;
}
}[/php]

Der zweite Ansatz nutzt aus, dass die meisten Tabellen eine Spalte id enthalten, deren Wert erst beim Einfügen in die Datenbank bestimmt wird und somit für den Validator noch mit null erscheint. Nun würde also die Prüfung wie folgt aussehen:

[php]<?php
class fsExampleValidator extends sfExampleBase {
protected function doClean($value) {
// if (is_null($value[‘id’])) { … }
return $value;
}
}[/php]

Diese Methode funktioniert offensichtlich nur bei Tabellen mit einem fortlaufenden Index, erfordert dafür nicht die Anpassung der Formular-Klassen.