/** * {@inheritdoc} */ public function buildView(FormView $view, FormInterface $form, array $options) { $fieldName = $view->vars['full_name']; $parentForm = $form->getParent(); if (!empty($parentForm)) { $config = $parentForm->getConfig(); $options = $config->getOptions(); $validationGroups = $options['validation_groups']; $dataClass = $config->getDataClass(); $entityMetadata = $dataClass !== null ? $this->validator->getMetadataFor($dataClass) : null; $view->vars['entity_constraints'] = $this->prepareConstraintsAttributes($fieldName, $entityMetadata, $validationGroups); } }
/** * Test preparing array of constraints based on entity metadata */ public function testPrepareConstraintsAttributes() { $entityMetadata = $this->validator->getMetadataFor('Sleepness\\UberFrontendValidationBundle\\Tests\\Fixtures\\Model\\Post'); $reflectedMethod = new ReflectionMethod($this->extension, 'prepareConstraintsAttributes'); $reflectedMethod->setAccessible(TRUE); $preparedConstraintsAttributes = $reflectedMethod->invoke($this->extension, 'post[title]', $entityMetadata, array('Default')); $fullFieldNames = array_keys($preparedConstraintsAttributes); $constraintNames = array_keys($preparedConstraintsAttributes[$fullFieldNames[0]]); $constraintProperties = array_keys($preparedConstraintsAttributes[$fullFieldNames[0]][$constraintNames[0]]); $this->assertEquals('post[title]', $fullFieldNames[0]); $this->assertEquals('NotBlank', $constraintNames[0]); $this->assertEquals('Length', $constraintNames[1]); $this->assertEquals('message', $constraintProperties[0]); $this->assertEquals('Title should not be blank!', $preparedConstraintsAttributes[$fullFieldNames[0]][$constraintNames[0]]['message']); }
/** * @param FormInterface $form * * @return array */ private function getEntityConstraints(FormInterface $form) { $config = $form->getParent()->getConfig(); if (!$config->hasOption('data_class') || !class_exists($config->getOption('data_class'))) { return []; } $constraints = []; /** @var ClassMetadata $metadata */ $metadata = $this->validator->getMetadataFor($config->getDataClass()); /** @var PropertyMetadata[] $properties */ $properties = $metadata->getPropertyMetadata($form->getName()); foreach ($properties as $property) { $constraints = array_merge($constraints, $property->findConstraints($metadata->getDefaultGroup())); } return $constraints; }
/** * @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))); }
public function getMetadataFor($value) { return $this->wrappedValidator->getMetadataFor($value); }