【问题标题】:Symfony2 validator, NotBlank but allow nullSymfony2 验证器,NotBlank 但允许 null
【发布时间】:2012-04-13 08:20:02
【问题描述】:

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

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

我已将此静态方法添加到我的 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());
}

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

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

【问题讨论】:

  • 有一个 Null-Validator,但它也无济于事,因为只有 NULL 是有效的,即如果它是一个字符串(无论是否为空),它将被违反。为什么不编写自定义验证器?
  • 自定义验证器确实是一种选择,但对我来说,这似乎是一个很常见的用例,很难相信开箱即用是不可能的。
  • 我也是。事实上,这似乎甚至是错误的(或者至少是措辞)。对我来说 NotBlank 意味着应该对空白字符串进行验证。我不明白为什么约束将 null 视为空白值。

标签: php symfony validation silex


【解决方案1】:

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

【讨论】:

  • 根据我的尝试,回调验证器不适用于 Silex 中的属性约束,还是我错了?
  • 我已经更新了我的答案来解释如何使用回调约束。
【解决方案2】:

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

namespace App\Entity;

use Symfony\Component\Validator\Constraints as Assert;

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

【讨论】:

    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    相关资源
    最近更新 更多