diff --git a/Annotation/ApiDoc.php b/Annotation/ApiDoc.php index dd7242a..a132a1b 100644 --- a/Annotation/ApiDoc.php +++ b/Annotation/ApiDoc.php @@ -579,6 +579,14 @@ class ApiDoc return $this; } + /** + * @return string + */ + public function getMethod() + { + return $this->method; + } + /** * @return array */ diff --git a/Extractor/ApiDocExtractor.php b/Extractor/ApiDocExtractor.php index 9241516..56d6589 100644 --- a/Extractor/ApiDocExtractor.php +++ b/Extractor/ApiDocExtractor.php @@ -282,9 +282,9 @@ class ApiDocExtractor $parameters = $this->clearClasses($parameters); $parameters = $this->generateHumanReadableTypes($parameters); - if ('PUT' === $method) { + if ('PUT' === $annotation->getMethod()) { // All parameters are optional with PUT (update) - array_walk($parameters, function ($val, $key) use (&$data) { + array_walk($parameters, function ($val, $key) use (&$parameters) { $parameters[$key]['required'] = false; }); } diff --git a/Tests/Extractor/ApiDocExtractorTest.php b/Tests/Extractor/ApiDocExtractorTest.php index a0dbd29..b09d8ad 100644 --- a/Tests/Extractor/ApiDocExtractorTest.php +++ b/Tests/Extractor/ApiDocExtractorTest.php @@ -11,6 +11,8 @@ namespace Nelmio\ApiDocBundle\Tests\Extractor; +use Nelmio\ApiDocBundle\Annotation\ApiDoc; +use Nelmio\ApiDocBundle\Extractor\ApiDocExtractor; use Nelmio\ApiDocBundle\Tests\WebTestCase; class ApiDocExtractorTest extends WebTestCase @@ -256,4 +258,28 @@ class ApiDocExtractorTest extends WebTestCase ); $this->assertCount(1, $parsers); } + + public function testPostRequestDoesRequireParametersWhenMarkedAsSuch() + { + $container = $this->getContainer(); + /** @var ApiDocExtractor $extractor */ + $extractor = $container->get('nelmio_api_doc.extractor.api_doc_extractor'); + /** @var ApiDoc $annotation */ + $annotation = $extractor->get('Nelmio\ApiDocBundle\Tests\Fixtures\Controller\TestController::requiredParametersAction', 'test_required_parameters'); + + $parameters = $annotation->getParameters(); + $this->assertTrue($parameters['required_field']['required']); + } + + public function testPutRequestDoesNeverRequireParameters() + { + $container = $this->getContainer(); + /** @var ApiDocExtractor $extractor */ + $extractor = $container->get('nelmio_api_doc.extractor.api_doc_extractor'); + /** @var ApiDoc $annotation */ + $annotation = $extractor->get('Nelmio\ApiDocBundle\Tests\Fixtures\Controller\TestController::requiredParametersAction', 'test_put_disables_required_parameters'); + + $parameters = $annotation->getParameters(); + $this->assertFalse($parameters['required_field']['required']); + } } diff --git a/Tests/Fixtures/Controller/TestController.php b/Tests/Fixtures/Controller/TestController.php index 82c15b5..b71cadd 100644 --- a/Tests/Fixtures/Controller/TestController.php +++ b/Tests/Fixtures/Controller/TestController.php @@ -65,6 +65,15 @@ class TestController { } + /** + * @ApiDoc( + * input="Nelmio\ApiDocBundle\Tests\Fixtures\Form\RequiredType" + * ) + */ + public function requiredParametersAction() + { + } + public function anotherAction() { } diff --git a/Tests/Fixtures/Form/RequiredType.php b/Tests/Fixtures/Form/RequiredType.php new file mode 100644 index 0000000..c0e2ec5 --- /dev/null +++ b/Tests/Fixtures/Form/RequiredType.php @@ -0,0 +1,29 @@ + + */ +class RequiredType extends AbstractType +{ + public function buildForm(FormBuilderInterface $builder, array $options) + { + $builder->add('required_field', 'text', array('required' => true)); + } + + /** + * Returns the name of this type. + * + * @return string The name of this type + */ + public function getName() + { + return ''; + } +} diff --git a/Tests/Fixtures/app/config/routing.yml b/Tests/Fixtures/app/config/routing.yml index f584f88..9f24fc0 100644 --- a/Tests/Fixtures/app/config/routing.yml +++ b/Tests/Fixtures/app/config/routing.yml @@ -219,3 +219,18 @@ test_route_24: defaults: { _controller: NelmioApiDocTestBundle:Test:zSecured } requirements: _method: POST + +test_required_parameters: + pattern: /api/other-resources/{id}.{_format} + defaults: { _controller: NelmioApiDocTestBundle:Resource:requiredParametersAction, _format: json } + requirements: + _method: POST + _format: json|xml|html + +test_put_disables_required_parameters: + pattern: /api/other-resources/{id}.{_format} + defaults: { _controller: NelmioApiDocTestBundle:Resource:requiredParametersAction, _format: json } + requirements: + _method: PUT + _format: json|xml|html +