diff --git a/RouteDescriber/FosRestDescriber.php b/RouteDescriber/FosRestDescriber.php index 1a4615f..b4015df 100644 --- a/RouteDescriber/FosRestDescriber.php +++ b/RouteDescriber/FosRestDescriber.php @@ -52,32 +52,44 @@ final class FosRestDescriber implements RouteDescriberInterface $parameter->setDescription($annotation->description); } - $normalizedRequirements = $this->normalizeRequirements($annotation->requirements); - if (null !== $normalizedRequirements) { - $parameter->setFormat($normalizedRequirements); + $pattern = $this->getPattern($annotation->requirements); + if (null !== $pattern) { + $parameter->setPattern($pattern); + } + + $format = $this->getFormat($annotation->requirements); + if (null !== $format) { + $parameter->setFormat($format); } } } } - private function normalizeRequirements($requirements) + private function getPattern($requirements) { - // if pattern if (is_array($requirements) && isset($requirements['rule'])) { return (string) $requirements['rule']; } + if (is_string($requirements)) { return $requirements; } - // if custom constraint - if ($requirements instanceof Constraint) { - if ($requirements instanceof Regex) { - return $requirements->getHtmlPattern(); - } + if ($requirements instanceof Regex) { + return $requirements->getHtmlPattern(); + } + + return null; + } + + private function getFormat($requirements) + { + if ($requirements instanceof Constraint && !$requirements instanceof Regex) { $reflectionClass = new \ReflectionClass($requirements); return $reflectionClass->getShortName(); } + + return null; } } diff --git a/Tests/Functional/Controller/ApiController.php b/Tests/Functional/Controller/ApiController.php index 60fa8cc..2db5fa5 100644 --- a/Tests/Functional/Controller/ApiController.php +++ b/Tests/Functional/Controller/ApiController.php @@ -23,6 +23,8 @@ use Nelmio\ApiDocBundle\Tests\Functional\Form\DummyType; use Nelmio\ApiDocBundle\Tests\Functional\Form\UserType; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Swagger\Annotations as SWG; +use Symfony\Component\Validator\Constraints\IsTrue; +use Symfony\Component\Validator\Constraints\Regex; /** * @Route("/api", host="api.example.com") @@ -104,8 +106,9 @@ class ApiController /** * @Route("/fosrest.{_format}", methods={"POST"}) - * @QueryParam(name="foo") - * @RequestParam(name="bar") + * @QueryParam(name="foo", requirements=@Regex("/^\d+$/")) + * @RequestParam(name="bar", requirements="\d+") + * @RequestParam(name="baz", requirements=@IsTrue) */ public function fosrestAction() { diff --git a/Tests/Functional/FunctionalTest.php b/Tests/Functional/FunctionalTest.php index 38ff95e..d003f3e 100644 --- a/Tests/Functional/FunctionalTest.php +++ b/Tests/Functional/FunctionalTest.php @@ -124,6 +124,22 @@ class FunctionalTest extends WebTestCase $parameters = $operation->getParameters(); $this->assertTrue($parameters->has('foo', 'query')); $this->assertTrue($parameters->has('bar', 'formData')); + $this->assertTrue($parameters->has('baz', 'formData')); + + $fooParameter = $parameters->get('foo', 'query'); + $this->assertNotNull($fooParameter->getPattern()); + $this->assertEquals('\d+', $fooParameter->getPattern()); + $this->assertNull($fooParameter->getFormat()); + + $barParameter = $parameters->get('bar', 'formData'); + $this->assertNotNull($barParameter->getPattern()); + $this->assertEquals('\d+', $barParameter->getPattern()); + $this->assertNull($barParameter->getFormat()); + + $bazParameter = $parameters->get('baz', 'formData'); + $this->assertNotNull($bazParameter->getFormat()); + $this->assertEquals('IsTrue', $bazParameter->getFormat()); + $this->assertNull($bazParameter->getPattern()); // The _format path attribute should be removed $this->assertFalse($parameters->has('_format', 'path'));