我无法验证的值允许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());
}
底线,我在寻找如何让String或NULL作为service_id
但不允许空字符串。
PS:我也试过MinLength(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);
对于谁运行到这个更高的版本(4.3以上)的人,你可以设置allowNull = true
:
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class SomeEntity
{
/**
* @Assert\NotBlank(allowNull = true)
*/
protected $someProperty;
}