2012-04-13 10 views
4

Ich habe Probleme, einen Wert zu validieren, der NULL, aber keine leere Zeichenfolge mit der Symfony2-Validatorkomponente erlaubt.Symfony2-Validierer, NotBlank, aber Null zulassen

Ich habe die Komponente in eine Silex-Anwendung integriert und das Property-Constraint-Ziel verwendet, um einige Eigenschaften meiner Application Entities zu überprüfen (keine Doctrine-Entity).

Ich habe diese statische Methode zu meiner Entity-Klasse hinzugefügt Namen und service_id auf meinem Entity zu validieren Problem ist, dass, wenn service_id NULL ist, die die NotBlank Einschränkung tritt in dem gültig sein sollten und meldet eine Verletzung.

static public function loadValidatorMetadata(ClassMetadata $metadata) 
{ 
    // name should never be NULL or a blank string 
    $metadata->addPropertyConstraint('name', new Assert\NotNull()); 
    $metadata->addPropertyConstraint('name', new Assert\NotBlank()); 

    // service_id should either be a non-blank string or NULL 
    $metadata->addPropertyConstraint('service_id', new Assert\NotBlank()); 
} 

Bottomline, ich bin auf der Suche, wie entweder ein String oder NULL als service_id zuzulassen, aber nicht eine leere Zeichenfolge zulassen.

PS: Ich habe auch versucht, die MinLength(1) Einschränkung, aber das erlaubt leere Zeichenfolgen leider.

+0

Es gibt eine Null-Validator, aber es wird Ihnen nicht helfen, da nur NULL gültig sein wird, das heißt, wenn es sich um eine Zeichenfolge (leer oder nicht ist) es wird verletzt werden. Warum nicht einen benutzerdefinierten Validator schreiben? – dbrumann

+1

Ein benutzerdefinierter Validator ist in der Tat eine Option, aber für mich schien es so ein allgemeiner Anwendungsfall, dass es schwer zu glauben ist, dass es unmöglich ist, out of the box zu tun. – ChrisR

+0

Ich auch. In der Tat scheint das sogar falsch (oder zumindest der Wortlaut). NotBlank bedeutet für mich, dass eine Validierung für eine leere Zeichenfolge erfolgen soll. Ich verstehe nicht, warum die Einschränkung null als leeren Wert behandelt. – codepushr

Antwort

9

Die NotBlank Einschränkung behandelt null als einen leeren Wert, wie in this test gesehen werden kann.

Bei Verwendung der Doktrin kann dies mithilfe der Valid-Einschränkung gelöst werden. Wenn der Wert des Feldes nicht null ist, versucht es, es zu validieren.

Da Sie keine Doktrinsentitäten verwenden, müssen Sie wahrscheinlich einen Callback-Validator verwenden oder eine eigene Constraint schreiben.

EDIT

Um Ihre neue Frage auf das Hinzufügen einer Rückruf Einschränkung als eine Eigenschaft Einschränkung zu beantworten: Nein, es ist nicht möglich, das zu tun.

Die Callback-Einschränkung wirkt sich auf das gesamte Objekt aus, nicht nur auf eine einzelne Eigenschaft. Hier ist ein Beispiel dafür, wie Sie die Callback-Einschränkung verwenden:

use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Component\Validator\Mapping\ClassMetadata; 
use Symfony\Component\Validator\ExecutionContext; 

$app = new Silex\Application(); 

$app->register(new Silex\Provider\ValidatorServiceProvider()); 

class Person 
{ 
    public $name; 

    public function validateName(ExecutionContext $context) 
    { 
     if ('John Doe' === $this->name) { 
      $context->addViolationAtPath('name', 'Name must not be "John Doe"'); 
     } 
    } 

    static public function loadValidatorMetadata(ClassMetadata $metadata) 
    { 
     $metadata->addConstraint(new Assert\Callback(array('validateName'))); 
     $metadata->addPropertyConstraint('name', new Assert\NotNull()); 
    } 
} 

$person = new Person(); 
$person->name = 'John Doe'; 
$violations = $app['validator']->validate($person); 
var_dump('Violations for John Doe'); 
var_dump((string) $violations); 

$person = new Person(); 
$violations = $app['validator']->validate($person); 
var_dump('Violations for Person with name null'); 
var_dump((string) $violations); 

$person = new Person(); 
$person->name = 'Igor Wiedler'; 
$violations = $app['validator']->validate($person); 
var_dump('Violations for Igor Wiedler'); 
var_dump((string) $violations); 
+0

Von dem, was ich versucht habe, funktionieren Callback-Validatoren nicht auf Eigenschaftseinschränkungen in Silex oder bin ich falsch? – ChrisR

+0

Ich habe meine Antwort aktualisiert, um zu erklären, wie die Callback-Einschränkung verwendet wird. – igorw

Verwandte Themen