/** * @param ValidatorInterface|LegacyValidatorInterface $validator * * @throws UnexpectedTypeException If $validator is invalid */ public function __construct($validator) { // 2.5 API if ($validator instanceof ValidatorInterface) { $metadata = $validator->getMetadataFor('Symfony\\Component\\Form\\Form'); // 2.4 API } elseif ($validator instanceof LegacyValidatorInterface) { $metadata = $validator->getMetadataFactory()->getMetadataFor('Symfony\\Component\\Form\\Form'); } else { throw new UnexpectedTypeException($validator, 'Symfony\\Component\\Validator\\Validator\\ValidatorInterface or Symfony\\Component\\Validator\\ValidatorInterface'); } // Register the form constraints in the validator programmatically. // This functionality is required when using the Form component without // the DIC, where the XML file is loaded automatically. Thus the following // code must be kept synchronized with validation.xml /** @var $metadata ClassMetadata */ $metadata->addConstraint(new Form()); $metadata->addPropertyConstraint('children', new Valid()); $this->validator = $validator; }
/** * @param ValidatorInterface|LegacyValidatorInterface $validator * * @throws UnexpectedTypeException If $validator is invalid */ public function __construct($validator) { // 2.5 API if ($validator instanceof ValidatorInterface) { $metadata = $validator->getMetadataFor('Symfony\\Component\\Form\\Form'); // 2.4 API } elseif ($validator instanceof LegacyValidatorInterface) { @trigger_error('Passing an instance of Symfony\\Component\\Validator\\ValidatorInterface as argument to the ' . __METHOD__ . ' method is deprecated since version 2.8 and will be removed in 3.0. Use an implementation of Symfony\\Component\\Validator\\Validator\\ValidatorInterface instead', E_USER_DEPRECATED); $metadata = $validator->getMetadataFactory()->getMetadataFor('Symfony\\Component\\Form\\Form'); } else { throw new UnexpectedTypeException($validator, 'Symfony\\Component\\Validator\\Validator\\ValidatorInterface or Symfony\\Component\\Validator\\ValidatorInterface'); } // Register the form constraints in the validator programmatically. // This functionality is required when using the Form component without // the DIC, where the XML file is loaded automatically. Thus the following // code must be kept synchronized with validation.xml /* @var $metadata ClassMetadata */ $metadata->addConstraint(new Form()); $metadata->addPropertyConstraint('children', new Valid()); $this->validator = $validator; }
/** * Attach the inline validator to the model metadata, this must be done once per admin. */ protected function attachInlineValidator() { $admin = $this; // add the custom inline validation option // TODO: Remove conditional method when bumping requirements to SF 2.5+ if (method_exists($this->validator, 'getMetadataFor')) { $metadata = $this->validator->getMetadataFor($this->getClass()); } else { $metadata = $this->validator->getMetadataFactory()->getMetadataFor($this->getClass()); } $metadata->addConstraint(new InlineConstraint(array('service' => $this, 'method' => function (ErrorElement $errorElement, $object) use($admin) { /* @var \Sonata\AdminBundle\Admin\AdminInterface $admin */ // This avoid the main validation to be cascaded to children // The problem occurs when a model Page has a collection of Page as property if ($admin->hasSubject() && spl_object_hash($object) !== spl_object_hash($admin->getSubject())) { return; } $admin->validate($errorElement, $object); foreach ($admin->getExtensions() as $extension) { $extension->validate($admin, $errorElement, $object); } }, 'serializingWarning' => true))); }