2012-04-13 17 views
4

我在验证一个值时允许使用NULL,但没有使用Symfony2验证程序组件的空字符串。Symfony2验证程序,NotBlank但允许为空

我已将该组件集成到Silex应用程序中,并使用Property Constraint目标来验证我的应用程序实体(不是Doctrine实体)的某些属性。

我已经将此静态方法添加到我的实体类中,以验证我的实体上的名称和service_id,问题是当service_id为NULL时应该有效,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()); 
} 

底线,我在寻找如何让String或NULL作为service_id但不允许空字符串。

PS:我也试过MinLength(1)约束,但不幸的是允许空字符串。

+0

有一个空值验证,但它不会帮助你们,因为只有NULL将是有效的,即如果它是一个字符串(空或不)它会被违反。为什么不写一个定制的验证器? – dbrumann 2012-04-13 12:57:06

+1

自定义验证器确实是一种选择,但对我来说,这似乎是一个常见的用例,很难相信它不可能做到开箱即用。 – ChrisR 2012-04-13 19:03:41

+0

我也是。事实上,这看起来甚至是错误的(或者至少是措辞)。对于我来说NotBlank意味着应该有一个空白字符串的验证。我不明白为什么约束将null视为空白值。 – codepushr 2014-05-14 19:27:44

回答

9

NotBlank约束将null视为空白值,可以看到in this test

使用原则时,可以通过使用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); 
+0

从我试过的回调验证器不会在Silex的属性约束或我错了吗? – ChrisR 2012-04-15 14:19:26

+0

我已经更新了我的答案,以解释如何使用回调约束。 – igorw 2012-04-15 15:21:33

相关问题