Merge pull request #1243 from ManInTheBox/proper-fos-rest-describer-pattern-setting

Fix #1239: FosRestDescriber properly configures Parameter#pattern property
This commit is contained in:
Guilhem N 2018-03-24 09:37:54 +01:00 committed by GitHub
commit 6263ed8479
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 43 additions and 12 deletions

View File

@ -52,32 +52,44 @@ final class FosRestDescriber implements RouteDescriberInterface
$parameter->setDescription($annotation->description); $parameter->setDescription($annotation->description);
} }
$normalizedRequirements = $this->normalizeRequirements($annotation->requirements); $pattern = $this->getPattern($annotation->requirements);
if (null !== $normalizedRequirements) { if (null !== $pattern) {
$parameter->setFormat($normalizedRequirements); $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'])) { if (is_array($requirements) && isset($requirements['rule'])) {
return (string) $requirements['rule']; return (string) $requirements['rule'];
} }
if (is_string($requirements)) { if (is_string($requirements)) {
return $requirements; return $requirements;
} }
// if custom constraint
if ($requirements instanceof Constraint) {
if ($requirements instanceof Regex) { if ($requirements instanceof Regex) {
return $requirements->getHtmlPattern(); return $requirements->getHtmlPattern();
} }
return null;
}
private function getFormat($requirements)
{
if ($requirements instanceof Constraint && !$requirements instanceof Regex) {
$reflectionClass = new \ReflectionClass($requirements); $reflectionClass = new \ReflectionClass($requirements);
return $reflectionClass->getShortName(); return $reflectionClass->getShortName();
} }
return null;
} }
} }

View File

@ -23,6 +23,8 @@ use Nelmio\ApiDocBundle\Tests\Functional\Form\DummyType;
use Nelmio\ApiDocBundle\Tests\Functional\Form\UserType; use Nelmio\ApiDocBundle\Tests\Functional\Form\UserType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Swagger\Annotations as SWG; use Swagger\Annotations as SWG;
use Symfony\Component\Validator\Constraints\IsTrue;
use Symfony\Component\Validator\Constraints\Regex;
/** /**
* @Route("/api", host="api.example.com") * @Route("/api", host="api.example.com")
@ -104,8 +106,9 @@ class ApiController
/** /**
* @Route("/fosrest.{_format}", methods={"POST"}) * @Route("/fosrest.{_format}", methods={"POST"})
* @QueryParam(name="foo") * @QueryParam(name="foo", requirements=@Regex("/^\d+$/"))
* @RequestParam(name="bar") * @RequestParam(name="bar", requirements="\d+")
* @RequestParam(name="baz", requirements=@IsTrue)
*/ */
public function fosrestAction() public function fosrestAction()
{ {

View File

@ -124,6 +124,22 @@ class FunctionalTest extends WebTestCase
$parameters = $operation->getParameters(); $parameters = $operation->getParameters();
$this->assertTrue($parameters->has('foo', 'query')); $this->assertTrue($parameters->has('foo', 'query'));
$this->assertTrue($parameters->has('bar', 'formData')); $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 // The _format path attribute should be removed
$this->assertFalse($parameters->has('_format', 'path')); $this->assertFalse($parameters->has('_format', 'path'));