mirror of
https://github.com/retailcrm/NelmioApiDocBundle.git
synced 2025-02-13 13:09:25 +03:00
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:
commit
6263ed8479
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
{
|
{
|
||||||
|
@ -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'));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user