/**
* Validates data returned by the controller if applicable.
*
* @param GetResponseForControllerResultEvent $event
*
* @throws ValidationException
*/
public function onKernelView(GetResponseForControllerResultEvent $event)
{
$request = $event->getRequest();
try {
$attributes = RequestAttributesExtractor::extractAttributes($request);
} catch (RuntimeException $e) {
return;
}
if ($request->isMethodSafe() || $request->isMethod(Request::METHOD_DELETE)) {
return;
}
$data = $event->getControllerResult();
$resourceMetadata = $this->resourceMetadataFactory->create($attributes['resource_class']);
if (isset($attributes['collection_operation_name'])) {
$validationGroups = $resourceMetadata->getCollectionOperationAttribute($attributes['collection_operation_name'], 'validation_groups');
} else {
$validationGroups = $resourceMetadata->getItemOperationAttribute($attributes['item_operation_name'], 'validation_groups');
}
if (!$validationGroups) {
// Fallback to the resource
$validationGroups = $resourceMetadata->getAttributes()['validation_groups'] ?? null;
}
if (is_callable($validationGroups)) {
$validationGroups = call_user_func_array($validationGroups, [$data]);
}
$violations = $this->validator->validate($data, null, $validationGroups);
if (0 !== count($violations)) {
throw new ValidationException($violations);
}
}