View source
<?php
namespace Symfony\Component\Validator;
use Symfony\Component\Translation\TranslatorInterface;
use Symfony\Component\Validator\Constraints\Valid;
use Symfony\Component\Validator\Exception\ValidatorException;
class Validator implements ValidatorInterface, Mapping\Factory\MetadataFactoryInterface {
private $metadataFactory;
private $validatorFactory;
private $translator;
private $translationDomain;
private $objectInitializers;
public function __construct(MetadataFactoryInterface $metadataFactory, ConstraintValidatorFactoryInterface $validatorFactory, TranslatorInterface $translator, $translationDomain = 'validators', array $objectInitializers = array()) {
$this->metadataFactory = $metadataFactory;
$this->validatorFactory = $validatorFactory;
$this->translator = $translator;
$this->translationDomain = $translationDomain;
$this->objectInitializers = $objectInitializers;
}
public function getMetadataFactory() {
return $this->metadataFactory;
}
public function getMetadataFor($value) {
return $this->metadataFactory
->getMetadataFor($value);
}
public function hasMetadataFor($value) {
return $this->metadataFactory
->hasMetadataFor($value);
}
public function validate($value, $groups = null, $traverse = false, $deep = false) {
$visitor = $this
->createVisitor($value);
foreach ($this
->resolveGroups($groups) as $group) {
$visitor
->validate($value, $group, '', $traverse, $deep);
}
return $visitor
->getViolations();
}
public function validateProperty($containingValue, $property, $groups = null) {
$visitor = $this
->createVisitor($containingValue);
$metadata = $this->metadataFactory
->getMetadataFor($containingValue);
if (!$metadata instanceof PropertyMetadataContainerInterface) {
$valueAsString = is_scalar($containingValue) ? '"' . $containingValue . '"' : 'the value of type ' . gettype($containingValue);
throw new ValidatorException(sprintf('The metadata for %s does not support properties.', $valueAsString));
}
foreach ($this
->resolveGroups($groups) as $group) {
if (!$metadata
->hasPropertyMetadata($property)) {
continue;
}
foreach ($metadata
->getPropertyMetadata($property) as $propMeta) {
$propMeta
->accept($visitor, $propMeta
->getPropertyValue($containingValue), $group, $property);
}
}
return $visitor
->getViolations();
}
public function validatePropertyValue($containingValue, $property, $value, $groups = null) {
$visitor = $this
->createVisitor(is_object($containingValue) ? $containingValue : $value);
$metadata = $this->metadataFactory
->getMetadataFor($containingValue);
if (!$metadata instanceof PropertyMetadataContainerInterface) {
$valueAsString = is_scalar($containingValue) ? '"' . $containingValue . '"' : 'the value of type ' . gettype($containingValue);
throw new ValidatorException(sprintf('The metadata for ' . $valueAsString . ' does not support properties.'));
}
$propertyPath = is_object($containingValue) ? $property : '';
foreach ($this
->resolveGroups($groups) as $group) {
if (!$metadata
->hasPropertyMetadata($property)) {
continue;
}
foreach ($metadata
->getPropertyMetadata($property) as $propMeta) {
$propMeta
->accept($visitor, $value, $group, $propertyPath);
}
}
return $visitor
->getViolations();
}
public function validateValue($value, $constraints, $groups = null) {
$context = new ExecutionContext($this
->createVisitor($value), $this->translator, $this->translationDomain);
$constraints = is_array($constraints) ? $constraints : array(
$constraints,
);
foreach ($constraints as $constraint) {
if ($constraint instanceof Valid) {
throw new ValidatorException(sprintf('The constraint %s cannot be validated. Use the method validate() instead.', get_class($constraint)));
}
$context
->validateValue($value, $constraint, '', $groups);
}
return $context
->getViolations();
}
private function createVisitor($root) {
return new ValidationVisitor($root, $this->metadataFactory, $this->validatorFactory, $this->translator, $this->translationDomain, $this->objectInitializers);
}
private function resolveGroups($groups) {
return $groups ? (array) $groups : array(
Constraint::DEFAULT_GROUP,
);
}
}