public function ValidationVisitor::validate in Plug 7
Validates a value.
If the value is an array or a traversable object, you can set the parameter <tt>$traverse</tt> to <tt>true</tt> in order to run through the collection and validate each element. If these elements can be collections again and you want to traverse them recursively, set the parameter <tt>$deep</tt> to <tt>true</tt> as well.
If you set <tt>$traversable</tt> to <tt>true</tt>, the visitor will nevertheless try to find metadata for the collection and validate its constraints. If no such metadata is found, the visitor ignores that and only iterates the collection.
If you don't set <tt>$traversable</tt> to <tt>true</tt> and the visitor does not find metadata for the given value, it will fail with an exception.
Parameters
mixed $value The value to validate.:
string $group The validation group to validate.:
string $propertyPath The current property path in the validation graph.:
bool $traverse Whether to traverse the value if it is traversable.:
bool $deep Whether to traverse nested traversable values recursively.:
Throws
Exception\NoSuchMetadataException If no metadata can be found for the given value.
Overrides ValidationVisitorInterface::validate
Deprecated
Deprecated since version 2.5, to be removed in Symfony 3.0.
File
- lib/
Symfony/ validator/ Symfony/ Component/ Validator/ ValidationVisitor.php, line 118
Class
- ValidationVisitor
- Default implementation of {@link ValidationVisitorInterface} and {@link GlobalExecutionContextInterface}.
Namespace
Symfony\Component\ValidatorCode
public function validate($value, $group, $propertyPath, $traverse = false, $deep = false) {
if (null === $value) {
return;
}
if (is_object($value)) {
$hash = spl_object_hash($value);
// Exit, if the object is already validated for the current group
if (isset($this->validatedObjects[$hash][$group])) {
return;
}
// Initialize if the object wasn't initialized before
if (!isset($this->validatedObjects[$hash])) {
foreach ($this->objectInitializers as $initializer) {
if (!$initializer instanceof ObjectInitializerInterface) {
throw new \LogicException('Validator initializers must implement ObjectInitializerInterface.');
}
$initializer
->initialize($value);
}
}
// Remember validating this object before starting and possibly
// traversing the object graph
$this->validatedObjects[$hash][$group] = true;
}
// Validate arrays recursively by default, otherwise every driver needs
// to implement special handling for arrays.
// https://github.com/symfony/symfony/issues/6246
if (is_array($value) || $traverse && $value instanceof \Traversable) {
foreach ($value as $key => $element) {
// Ignore any scalar values in the collection
if (is_object($element) || is_array($element)) {
// Only repeat the traversal if $deep is set
$this
->validate($element, $group, $propertyPath . '[' . $key . ']', $deep, $deep);
}
}
try {
$this->metadataFactory
->getMetadataFor($value)
->accept($this, $value, $group, $propertyPath);
} catch (NoSuchMetadataException $e) {
// Metadata doesn't necessarily have to exist for
// traversable objects, because we know how to validate
// them anyway. Optionally, additional metadata is supported.
}
}
else {
$this->metadataFactory
->getMetadataFor($value)
->accept($this, $value, $group, $propertyPath);
}
}