Symfony2验证器,NotBlank但允许null

时间:2012-04-13 08:20:02

标签: php symfony validation silex

我无法验证值以允许NULL,但不能使用Symfony2验证程序组件验证空字符串。

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

我已经将这个静态方法添加到我的Entity类中以验证我的Entity上的name和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());
}

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

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

2 个答案:

答案 0 :(得分:9)

NotBlank约束将null视为空值,如in this test所示。

使用doctrine时,可以使用Valid约束来解决此问题。如果字段的值不是null,它将尝试验证它。

由于您没有使用doctrine实体,因此您可能必须使用回调验证程序或编写自己的约束。

修改

回答关于添加回调约束作为属性约束的新问题:不,不可能这样做。

回调约束作用于整个对象,而不仅仅是单个属性。以下是如何使用回调约束的示例:

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

答案 1 :(得分:0)

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

namespace App\Entity;

use Symfony\Component\Validator\Constraints as Assert;

class SomeEntity
{
    /**
     * @Assert\NotBlank(allowNull = true)
     */
    protected $someProperty;
}