Symfony2 验证器,NotBlank 但允许空


Symfony2 validator, NotBlank but allow null

我在验证一个值以允许 NULL 但不允许使用 Symfony2 验证器组件的空字符串时遇到问题。

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

我已将此静态方法添加到我的实体类中以验证我的实体上的名称和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());
}

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

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

对于在更高版本(4.3 及更高版本)上遇到此问题的任何人,您可以设置allowNull = true

namespace App'Entity;
use Symfony'Component'Validator'Constraints as Assert;
class SomeEntity
{
    /**
     * @Assert'NotBlank(allowNull = true)
     */
    protected $someProperty;
}

NotBlank约束将null视为空白值,如本测试所示。

使用原则时,这可以通过使用有效约束来解决。如果字段的值未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);