Symfony2 validator, NotBlank but allow null
php, silex, symfony, validation
Solution
The `NotBlank` constraint treats `null` as a blank value, as can be seen in this test.
When using doctrine, this can be solved by using the Valid constraint. If the value of the field is not `null`, it will attempt to validate it.
Since you are not using doctrine entities, you'll probably have to use a callback validator or write your own constraint.
EDIT
To answer your new question on adding a callback constraint as a property constraint: No, it is not possible to do that.
The callback constraint acts on the whole object, not just a single property. Here's an example of how you can use the callback constraint:
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);
Problem
I'm having trouble validating a value to allow NULL but not an empty string with the Symfony2 validator component. I've integrated the component in a Silex application and used the Property Constraint target to validate some properties of my Application Entities (not a Doctrine Entity). I've added this static method to my Entity class to validate name and service_id on my Entity, problem is that when `service_id` is NULL which should be valid the `NotBlank` constraint kicks in and reports a violation. ``` 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, I'm looking how to allow either a String or NULL as `service_id` but not allow an empty string. PS: I've also tried the `MinLength(1)` constraint but that allows empty strings unfortunately.