From d0149c65ab43fecc31f8efe32474d565994c6b8c Mon Sep 17 00:00:00 2001 From: Loick Piera Date: Thu, 17 Apr 2014 14:06:41 +0200 Subject: [PATCH] fix #357 --- Extractor/Handler/FosRestHandler.php | 31 ++++++++++++++++--- .../Extractor/Handler/FosRestHandlerTest.php | 18 +++++++++++ Tests/Fixtures/Controller/TestController.php | 9 ++++++ Tests/Fixtures/app/config/routing.yml | 6 ++++ 4 files changed, 60 insertions(+), 4 deletions(-) diff --git a/Extractor/Handler/FosRestHandler.php b/Extractor/Handler/FosRestHandler.php index 2a02fd0..b866df0 100644 --- a/Extractor/Handler/FosRestHandler.php +++ b/Extractor/Handler/FosRestHandler.php @@ -14,41 +14,64 @@ namespace Nelmio\ApiDocBundle\Extractor\Handler; use Nelmio\ApiDocBundle\Extractor\HandlerInterface; use Nelmio\ApiDocBundle\Annotation\ApiDoc; use Symfony\Component\Routing\Route; +use Symfony\Component\Validator\Constraint; +use Symfony\Component\Validator\Constraints\Regex; use FOS\RestBundle\Controller\Annotations\RequestParam; use FOS\RestBundle\Controller\Annotations\QueryParam; class FosRestHandler implements HandlerInterface { + /** + * @inheritdoc + */ public function handle(ApiDoc $annotation, array $annotations, Route $route, \ReflectionMethod $method) { foreach ($annotations as $annot) { if ($annot instanceof RequestParam) { $annotation->addParameter($annot->name, array( 'required' => $annot->strict && $annot->default === null, - 'dataType' => $annot->requirements, + 'dataType' => $this->handleRequirements($annot->requirements), 'description' => $annot->description, 'readonly' => false )); } elseif ($annot instanceof QueryParam) { if ($annot->strict && $annot->nullable === false && $annot->default === null) { $annotation->addRequirement($annot->name, array( - 'requirement' => $annot->requirements, + 'requirement' => $this->handleRequirements($annot->requirements), 'dataType' => '', 'description' => $annot->description, )); } elseif ($annot->default !== null) { $annotation->addFilter($annot->name, array( - 'requirement' => $annot->requirements, + 'requirement' => $this->handleRequirements($annot->requirements), 'description' => $annot->description, 'default' => $annot->default, )); } else { $annotation->addFilter($annot->name, array( - 'requirement' => $annot->requirements, + 'requirement' => $this->handleRequirements($annot->requirements), 'description' => $annot->description, )); } } } } + + /** + * Handle FOSRestBundle requirements in order to return a string. + * + * @param mixed $requirements + * @return string + */ + private function handleRequirements($requirements) + { + if (is_object($requirements) && $requirements instanceof Constraint) { + if ($requirements instanceof Regex) { + return $requirements->getHtmlPattern(); + } + $class = get_class($requirements); + return substr($class, strrpos($class, '\\')+1); + } + return (string)$requirements; + } } diff --git a/Tests/Extractor/Handler/FosRestHandlerTest.php b/Tests/Extractor/Handler/FosRestHandlerTest.php index 145daca..bcb0de9 100644 --- a/Tests/Extractor/Handler/FosRestHandlerTest.php +++ b/Tests/Extractor/Handler/FosRestHandlerTest.php @@ -86,5 +86,23 @@ class FosRestHandlerTest extends WebTestCase $this->assertArrayNotHasKey('default', $filter); } + + public function testGetWithConstraintAsRequirements() + { + $container = $this->getContainer(); + $extractor = $container->get('nelmio_api_doc.extractor.api_doc_extractor'); + $annotation = $extractor->get('Nelmio\ApiDocBundle\Tests\Fixtures\Controller\TestController::zActionWithConstraintAsRequirements', 'test_route_21'); + + $this->assertNotNull($annotation); + + $filters = $annotation->getFilters(); + $this->assertCount(1, $filters); + $this->assertArrayHasKey('mail', $filters); + + $filter = $filters['mail']; + + $this->assertArrayHasKey('requirement', $filter); + $this->assertEquals($filter['requirement'], 'Email'); + } } diff --git a/Tests/Fixtures/Controller/TestController.php b/Tests/Fixtures/Controller/TestController.php index 5d9d3f3..dea3568 100644 --- a/Tests/Fixtures/Controller/TestController.php +++ b/Tests/Fixtures/Controller/TestController.php @@ -15,6 +15,7 @@ use FOS\RestBundle\Controller\Annotations\QueryParam; use FOS\RestBundle\Controller\Annotations\RequestParam; use Nelmio\ApiDocBundle\Annotation\ApiDoc; use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Validator\Constraints\Email; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache; class TestController @@ -129,6 +130,14 @@ class TestController public function zActionWithQueryParamNoDefaultAction() { } + + /** + * @ApiDoc() + * @QueryParam(name="mail", requirements=@Email, description="Email of someone.") + */ + public function zActionWithConstraintAsRequirements() + { + } /** * @ApiDoc( diff --git a/Tests/Fixtures/app/config/routing.yml b/Tests/Fixtures/app/config/routing.yml index 4ee5e5a..5502bee 100644 --- a/Tests/Fixtures/app/config/routing.yml +++ b/Tests/Fixtures/app/config/routing.yml @@ -149,3 +149,9 @@ test_route_private: test_route_exclusive: pattern: /exclusive defaults: { _controller: NelmioApiDocTestBundle:Test:exclusive } + +test_route_21: + pattern: /z-action-with-constraint-requirements + defaults: { _controller: NelmioApiDocTestBundle:Test:zActionWithConstraintAsRequirements } + requirements: + _method: GET