diff --git a/src/ZfrRest/Mvc/Controller/MethodHandler/DataValidationTrait.php b/src/ZfrRest/Mvc/Controller/MethodHandler/DataValidationTrait.php index ef9dd4b..32d2437 100644 --- a/src/ZfrRest/Mvc/Controller/MethodHandler/DataValidationTrait.php +++ b/src/ZfrRest/Mvc/Controller/MethodHandler/DataValidationTrait.php @@ -19,7 +19,9 @@ namespace ZfrRest\Mvc\Controller\MethodHandler; use Zend\InputFilter\InputFilterPluginManager; +use Zend\Mvc\Controller\AbstractController; use ZfrRest\Http\Exception\Client\UnprocessableEntityException; +use ZfrRest\Mvc\Controller\ValidationGroupProviderInterface; use ZfrRest\Mvc\Exception\RuntimeException; use ZfrRest\Resource\ResourceInterface; @@ -39,14 +41,20 @@ trait DataValidationTrait /** * Filter and validate the data * - * @param ResourceInterface $resource - * @param array $data + * @param ResourceInterface $resource + * @param array $data + * @param AbstractController|null $controller + * @param string|null $validationGroupName * @return array * @throws RuntimeException If no input filter is bound to the resource * @throws UnprocessableEntityException If validation fails */ - public function validateData(ResourceInterface $resource, array $data) - { + public function validateData( + ResourceInterface $resource, + array $data, + AbstractController $controller = null, + $validationGroupName = null + ) { if (!($inputFilterName = $resource->getMetadata()->getInputFilterName())) { throw new RuntimeException('No input filter name has been found in resource metadata'); } @@ -55,6 +63,14 @@ public function validateData(ResourceInterface $resource, array $data) $inputFilter = $this->inputFilterPluginManager->get($inputFilterName); $inputFilter->setData($data); + if ($controller instanceof ValidationGroupProviderInterface && $validationGroupName) { + $validationGroups = $controller->getValidationGroupSpecification(); + + if (isset($validationGroups[$validationGroupName])) { + $inputFilter->setValidationGroup($validationGroups[$validationGroupName]); + } + } + if (!$inputFilter->isValid()) { throw new UnprocessableEntityException( 'Validation error', diff --git a/src/ZfrRest/Mvc/Controller/MethodHandler/PostHandler.php b/src/ZfrRest/Mvc/Controller/MethodHandler/PostHandler.php index e2d8a3a..22b47e1 100644 --- a/src/ZfrRest/Mvc/Controller/MethodHandler/PostHandler.php +++ b/src/ZfrRest/Mvc/Controller/MethodHandler/PostHandler.php @@ -83,7 +83,7 @@ public function handleMethod(AbstractRestfulController $controller, ResourceInte $data = json_decode($controller->getRequest()->getContent(), true); if ($controller->getAutoValidate()) { - $data = $this->validateData($singleResource, $data); + $data = $this->validateData($singleResource, $data, $controller, 'post'); } if ($controller->getAutoHydrate()) { diff --git a/src/ZfrRest/Mvc/Controller/MethodHandler/PutHandler.php b/src/ZfrRest/Mvc/Controller/MethodHandler/PutHandler.php index d1af871..86d11cd 100644 --- a/src/ZfrRest/Mvc/Controller/MethodHandler/PutHandler.php +++ b/src/ZfrRest/Mvc/Controller/MethodHandler/PutHandler.php @@ -76,7 +76,7 @@ public function handleMethod(AbstractRestfulController $controller, ResourceInte $data = json_decode($controller->getRequest()->getContent(), true); if ($controller->getAutoValidate()) { - $data = $this->validateData($resource, $data); + $data = $this->validateData($resource, $data, $controller, 'put'); } if ($controller->getAutoHydrate()) { diff --git a/src/ZfrRest/Mvc/Controller/ValidationGroupProviderInterface.php b/src/ZfrRest/Mvc/Controller/ValidationGroupProviderInterface.php new file mode 100644 index 0000000..b6c5c73 --- /dev/null +++ b/src/ZfrRest/Mvc/Controller/ValidationGroupProviderInterface.php @@ -0,0 +1,35 @@ + + * @licence MIT + */ +interface ValidationGroupProviderInterface +{ + /** + * Get the validation group specification + * + * @return array + */ + public function getValidationGroupSpecification(); +} diff --git a/tests/ZfrRestTest/Asset/Mvc/ControllerWithValidationGroupSpec.php b/tests/ZfrRestTest/Asset/Mvc/ControllerWithValidationGroupSpec.php new file mode 100644 index 0000000..cc7da21 --- /dev/null +++ b/tests/ZfrRestTest/Asset/Mvc/ControllerWithValidationGroupSpec.php @@ -0,0 +1,36 @@ + ['field'] + ]; + } +} diff --git a/tests/ZfrRestTest/Asset/Mvc/DataValidationObject.php b/tests/ZfrRestTest/Asset/Mvc/DataValidationObject.php index 0d4bc85..49ff50e 100644 --- a/tests/ZfrRestTest/Asset/Mvc/DataValidationObject.php +++ b/tests/ZfrRestTest/Asset/Mvc/DataValidationObject.php @@ -25,12 +25,13 @@ class DataValidationObject { use DataValidationTrait; + protected $controller; + /** - * @param InputFilterPluginManager $inputFilterPluginManager + * @param InputFilterPluginManager $inputFilterPluginManager */ public function __construct(InputFilterPluginManager $inputFilterPluginManager) { - $this->inputFilterPluginManager = $inputFilterPluginManager; + $this->inputFilterPluginManager = $inputFilterPluginManager; } - } diff --git a/tests/ZfrRestTest/Mvc/Controller/MethodHandler/DataValidationTraitTest.php b/tests/ZfrRestTest/Mvc/Controller/MethodHandler/DataValidationTraitTest.php index 221f495..71609a0 100644 --- a/tests/ZfrRestTest/Mvc/Controller/MethodHandler/DataValidationTraitTest.php +++ b/tests/ZfrRestTest/Mvc/Controller/MethodHandler/DataValidationTraitTest.php @@ -20,6 +20,7 @@ use PHPUnit_Framework_TestCase; use ZfrRest\Options\ControllerBehavioursOptions; +use ZfrRestTest\Asset\Mvc\ControllerWithValidationGroupSpec; use ZfrRestTest\Asset\Mvc\DataValidationObject; /** @@ -117,4 +118,40 @@ public function testThrowExceptionOnFailedValidation() $this->dataValidation->validateData($resource, $data); } + + public function testCanUseValidationGroup() + { + $resource = $this->getMock('ZfrRest\Resource\ResourceInterface'); + $metadata = $this->getMock('ZfrRest\Resource\Metadata\ResourceMetadataInterface'); + + $resource->expects($this->once())->method('getMetadata')->will($this->returnValue($metadata)); + $metadata->expects($this->once())->method('getInputFilterName')->will($this->returnValue('inputFilter')); + + $data = ['foo']; + + $inputFilter = $this->getMock('Zend\InputFilter\InputFilterInterface'); + $inputFilter->expects($this->once())->method('setData')->with($data); + $inputFilter->expects($this->once()) + ->method('isValid') + ->will($this->returnValue(true)); + + $inputFilter->expects($this->once()) + ->method('setValidationGroup') + ->with(['field']); + + $this->inputFilterPluginManager->expects($this->once()) + ->method('get') + ->with('inputFilter') + ->will($this->returnValue($inputFilter)); + + $inputFilter->expects($this->once()) + ->method('getValues') + ->will($this->returnValue(['filtered'])); + + $controller = new ControllerWithValidationGroupSpec(); + + $result = $this->dataValidation->validateData($resource, $data, $controller, 'post'); + + $this->assertEquals(['filtered'], $result); + } }