7

Symfony2 バリデータ コンポーネントを使用して、NULL を許可するが空の文字列を許可しないように値を検証するのに問題があります。

コンポーネントを Silex アプリケーションに統合し、Property Constraint ターゲットを使用してアプリケーション エンティティ (Doctrine エンティティではない) のいくつかのプロパティを検証しました。

この静的メソッドを Entity クラスに追加して、Entity の name と service_id を検証しました。問題は、service_idNULL が有効である必要がある場合、NotBlank制約が開始され、違反が報告されることです。

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());
}

要するに、文字列または NULL を許可する方法を探していますservice_idが、空の文字列は許可しません。

PS:制約も試しましたMinLength(1)が、残念ながら空の文字列が許可されています。

4

2 に答える 2

9

このテストでわかるように、NotBlank制約は空白の値として扱われます。null

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

ドクトリン エンティティを使用していないため、コールバック バリデーターを使用するか、独自の制約を作成する必要があります。

編集

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

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

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);
于 2012-04-15T11:38:10.173 に答える