/** * Resolve request parameter * * @param ActionInterface $action * @param CallableInterface $callable * @param array $inputArguments * @param \ReflectionParameter $parameter * * @return object * * @throws \Exception */ private function resolveRequest(ActionInterface $action, CallableInterface $callable, array $inputArguments, \ReflectionParameter $parameter) { $class = $parameter->getClass(); if ($class->isInterface()) { throw new \RuntimeException(sprintf('Could not create instance via interface for parameter "%s" in method "%s". ' . 'You must set the class for type hinting.', $parameter->getName(), Reflection::getCalledMethod($callable->getReflection()))); } if ($class->isAbstract()) { throw new \RuntimeException(sprintf('Could not create instance via abstract class for parameter "%s" in method "%s". ' . 'You must set the real class for type hinting.', $parameter->getName(), Reflection::getCalledMethod($callable->getReflection()))); } /** @var RequestInterface $request */ $request = $class->newInstance(); // Map arguments $this->objectMapper->map($request, $inputArguments, ObjectMetadata::DEFAULT_GROUP); // Validate process if ($this->validator) { if ($this->validator instanceof VarTagValidatorInterface) { $violationList = $this->validator->validateObjectByVarTags($request); if (count($violationList)) { throw ViolationListException::create($violationList); } } $violationList = $this->validator->validate($request); if (count($violationList)) { throw ViolationListException::create($violationList); } } return $request; }
/** * Strict request validation * * @param RequestInterface $request * * @throws ViolationListException */ private function strictRequestValidate(RequestInterface $request) { $requestMetadata = $this->validator->getMetadataFor($request); $useStrictGroup = false; // Search constraints by group "Strict" if ($requestMetadata instanceof ClassMetadata) { foreach ($requestMetadata->getConstrainedProperties() as $propertyName) { $propertyMetadata = $requestMetadata->getPropertyMetadata($propertyName); if (count($propertyMetadata)) { $propertyMetadata = array_shift($propertyMetadata); } else { continue; } $constraintsInStrictGroup = $propertyMetadata->findConstraints('Strict'); if (count($constraintsInStrictGroup)) { $useStrictGroup = true; break; } } } if ($useStrictGroup) { // The any properties in request class have a "Strict" group validation $violationList = $this->validator->validate($request, null, ['Strict']); if (count($violationList)) { throw ViolationListException::create($violationList); } return; } if ($this->validator instanceof VarTagValidatorInterface) { $violationList = $this->validator->validateObjectByVarTags($request); if (count($violationList)) { throw ViolationListException::create($violationList); } } }