How to allow empty values in symfony2 validators How to allow empty values in symfony2 validators symfony symfony

How to allow empty values in symfony2 validators


You must explicitly set 'required' => false in your FormBuilder class for all optional fields. Here's a paragraph describing field type options.


Edit. Getting quite a few downvotes. By default all validators treat null values as valid, except NotNull and NotEmpty. Neither of the two was used in the question. The question is implicitly about how to turn off the client-side required attribute that is turned on by default.


Setting the required option is not the solution:

Also note that setting the required option to true will not result in server-side validation to be applied. In other words, if a user submits a blank value for the field (either with an old browser or web service, for example), it will be accepted as a valid value unless you use Symfony's NotBlank or NotNull validation constraint.

http://symfony.com/doc/current/book/forms.html#field-type-options

For my custom validators, I add a

if (null == $value) {    return true;}

to the isValid() method. However, I'm not sure what would be the best way for the standard validator classes.


if i understand correctly you want server side validation only if value is entered. I am exactly in the same scenario. I want to validate a URL only if the URL is provided. The best way i came across was to write my own custom validation class. You can write a generic custom validation class.

I followed this link https://symfony-docs-chs.readthedocs.org/en/2.0/cookbook/validation/custom_constraint.html except for few changes because of symfony's latest version. Here is the implementation

Acme\BundleNameBundle\Validator\Constraints\cstmUrl

namespace Acme\BundleNameBundle\Validator\Constraints;use Symfony\Component\Validator\Constraint;use Symfony\Component\Validator\Constraints\Url;/** * @Annotation */class CstmUrl extends Url{    public $message = 'The URL "%string%" is not valid';}

Acme\BundleNameBundle\Validator\Constraints\cstmUrlValidator

namespace Acme\BundleNameBundle\Validator\Constraints;use Symfony\Component\Validator\Constraint;use Symfony\Component\Validator\Constraints\Url;use Symfony\Component\Validator\Constraints\UrlValidator;class CstmUrlValidator extends UrlValidator{    public function validate($value, Constraint $constraint)    {        if(!$value || empty($value))            return true;        parent::validate($value, $constraint);    }}

Validtion.yml

Acme\BundleNameBundle\Entity\Student:    Url:        - Acme\BundleNameBundle\Validator\Constraints\CstmUrl: ~

inside Controller just bind the constraint you normally would do

'constraints'=> new CstmUrl(array("message"=>"Invalid url provided"))

I am sure there can be other better ways of doing it, but for now i feel this does the job well.