Chr*_*isR 5 php validation symfony silex
我在验证值以允许NULL但是没有使用Symfony2验证器组件的空字符串时遇到问题.
我已将该组件集成到Silex应用程序中,并使用Property Constraint目标来验证我的应用程序实体(不是Doctrine实体)的某些属性.
我已经将这个静态方法添加到我的Entity类中以验证我的Entity上的name和service_id,问题是当service_idNULL为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());
}
Run Code Online (Sandbox Code Playgroud)
Bottomline,我正在寻找如何允许String或NULL,service_id但不允许空字符串.
PS:我也试过了MinLength(1)约束但不幸的是它允许空字符串.
Jon*_*han 12
对于在更高版本(4.3 及以上)上遇到此问题的任何人,您可以设置allowNull = true:
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class SomeEntity
{
/**
* @Assert\NotBlank(allowNull = true)
*/
protected $someProperty;
}
Run Code Online (Sandbox Code Playgroud)
该NotBlank约束把null为空值,可以看出在本次测试.
使用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);
Run Code Online (Sandbox Code Playgroud)