2014-05-05 4 views
5

tl; dr:Fügen Sie einen benutzerdefinierten Validator für das nicht zugeordnete Feld hinzu, aber mit dem Kontext der gesamten Formularübergabe?

  1. Ich brauche eine Einschränkung benutzerdefinierte Validierung auf einem nicht zugeordneten Formularfeld
  2. ich die ID des Objekts ausführen müssen ist die Form, die sie aus der Betrachtung tun meine Validierung Constraint
  3. zu beseitigen Manipulation
  4. Anbringen der Validierung auf die Form selbst oder das nicht zugeordnete Feld gibt mir nicht genug Kontext meine Validierung Abfrage auszuführen

Ich habe ein nicht zugeordnetes Feld in meinem Person Entitätsformular, für das ich eine Überprüfung ausführen muss. Ich habe this great article auf, wie man dies tut, aber mein Anwendungsfall ist etwas anders und nicht vollständig durch den Artikel abgedeckt.

Ich mache meine eigene Eindeutige Einschränkung, die eine benutzerdefinierte Abfrage ausführen muss, um die Eindeutigkeit zu ermitteln. Um die Abfrage auszuführen, benötige ich Zugriff auf den Feldwert, der gesendet wurde, sowie das ursprüngliche Objekt Person (so kann ich seine ID abrufen, wenn es sich um einen Aktualisierungsvorgang handelt). Ohne das Objekt Person zu haben, kann ich es während der Eindeutigkeitsabfrage nicht ausschließen.

Wenn ich den Validator auf der PersonType Klasse gelten wie folgt:

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver 
     ->setDefaults(array(
      'data_class' => 'CS\AcmeBundle\Entity\Person', 
      'constraints' => array(
       new MyUniqueValidator(), 
      ) 
     )) 
    ; 
} 

Dann wird der Validator die gesamte Person Objekt weitergegeben, die die Validierung durchgeführt. Das hilft mir nicht, weil die übermittelten Formulardaten nicht auf dem Person Objekt gespeichert werden (es ist ein nicht zugeordnetes Feld, das ich handhabe, nachdem $form->isValid() in der Steuerung aufgerufen wird).

Wenn ich die Prüfung für das nicht zugeordnete Feld gelten direkt statt:

$builder 
     ->add('myUnmappedField', 'text', array(
      'mapped' => false, 
      'constraints' => array(
       new MyUniqueValidator(), 
      ) 
      ), 
     )) 

Dann wird das Objekt, das ich an den Validator übergeben bekommen ist nur die eigenständige Form Text, und nichts anderes. Ich habe nicht die ID Person Objekt (wenn es eine Aktualisierungsoperation war), um nach Eindeutigkeitsabfrage durchzuführen.

Hoffentlich habe ich das richtig erklärt. Habe ich irgendwelche Möglichkeiten, diese Art der Validierung anmutig durchzuführen?

Antwort

5

Sie sagen, Sie haben ein nicht zugeordnetes Feld. Wäre es hilfreich, wenn Sie es der Entität Person zuordnen? Erstellen Sie einfach eine neue Eigenschaft in der Person-Klasse mit Getter- und Setter-Methoden, aber nicht mit dem ORM, da Sie nicht möchten, dass es persistent bleibt.

Wenn Sie Ihre Person-Klasse nicht polieren möchten, können Sie auch eine andere zusammengesetzte Klasse erstellen, in der Ihr derzeit nicht zugeordnetes Feld und ein Person-Objekt enthalten sind (Sie werden es dann zuordnen). Natürlich setzen Sie dann data_class auf den Namespace des neuen Objekts.

Beide obigen Lösungen sollten mit dem oberen Code arbeiten, den Sie dort haben. Bitte lassen Sie mich wissen, dass es geholfen hat.

+0

Danke. Ich ging mit dem Hinzufügen einer anderen Eigenschaft auf meiner Entität Person und Zuordnung des Formularfelds zu diesem. Das funktioniert gut. – Brian

+0

Froh ich könnte helfen;) Und auch in der Zukunft, immer daran denken, eine Form kann nur ein zugrunde liegendes Objekt haben.Wenn Sie mehr als ein Objekt oder ähnliches benötigen, erstellen Sie ein anderes zusammengesetztes Objekt und es kann immer mehr Objekte/Eigenschaften enthalten :) – tomazahlin

+3

Sicher, das funktioniert, aber das kann nicht die akzeptierte Antwort auf die Frage sein, die gestellt wurde. Das Problem ist damit nicht behoben, es wird einfach umgangen – AlexK