2012-04-13 14 views
4

NULLを許可する値を検証するのに問題がありますが、Symfony2バリデーターコンポーネントでは空の文字列ではありません。Symfony2バリデーター、NotBlankは許可するnull

私は、サイレックス・アプリケーションでコンポーネントを統合し、私の応用エンティティ(ない教義エンティティ)のいくつかのプロパティを検証するために、プロパティーの制約のターゲットを使用しました。

私はこの問題は、service_idが有効であるべきNULLのときNotBlank制約がで蹴り、違反を報告することで、私のエンティティの名前とのservice_idを検証するために、私のエンティティクラスにこの静的メソッドを追加しました。

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は、私がservice_idとして文字列またはNULLを許可しますが、空の文字列を許可しない方法を探しています。

PS:私はまたMinLength(1)制約を試してみたが、それは残念ながら、空の文字列を許可します。

+0

Null-Validatorがありますが、NULLだけが有効な場合、つまり文字列(空であるかどうか)のどちらでも有効です。 )それは違反されるでしょう。カスタムバリデータを書きませんか? – dbrumann

+1

カスタムバリデーターは確かにオプションですが、私にはそれがボックスから外すことは不可能だとは考えにくいという共通の用途に思えました。 – ChrisR

+0

私もそうです。実際にはこれは間違っているようです(少なくとも言葉遣い)。私にとって、NotBlankは、空の文字列の検証が必要であることを意味します。私は制約が空白値としてnullを扱う理由を理解していません。 – codepushr

答えて

9

nullは、in this testのように、nullをブランク値として扱います。

doctrineを使用する場合、これはValidという制約を使用して解決できます。フィールドの値がnullでなければ、フィールドの値を検証しようとします。

Doctrineエンティティを使用していないので、おそらくコールバックバリデーターを使用するか、独自の制約を記述する必要があります。

EDIT

は、プロパティの制約としてコールバックの制約を追加することで、あなたの新しい質問に答えるために:いいえ、それを行うことはできません。

コールバック制約は、単一のプロパティだけでなくオブジェクト全体に作用します。

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

コールバック・バリデーターはSilexのプロパティー制約で動作しませんでしたか、間違っていますか? – ChrisR

+0

私は自分の答えを更新して、コールバック制約の使い方を説明しました。 – igorw

関連する問題