Merge pull request #524 from lucasvanlierop/fix-no-required-parameters-for-put-requests

Fix no required parameters for PUT requests
This commit is contained in:
William Durand 2014-10-08 11:34:06 +02:00
commit c69ab200d0
6 changed files with 89 additions and 2 deletions

View File

@ -579,6 +579,14 @@ class ApiDoc
return $this;
}
/**
* @return string
*/
public function getMethod()
{
return $this->method;
}
/**
* @return array
*/

View File

@ -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;
});
}

View File

@ -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']);
}
}

View File

@ -65,6 +65,15 @@ class TestController
{
}
/**
* @ApiDoc(
* input="Nelmio\ApiDocBundle\Tests\Fixtures\Form\RequiredType"
* )
*/
public function requiredParametersAction()
{
}
public function anotherAction()
{
}

View File

@ -0,0 +1,29 @@
<?php
namespace Nelmio\ApiDocBundle\Tests\Fixtures\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
/**
* Class SimpleType
*
* @author Lucas van Lierop <lucas@vanlierop.org>
*/
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 '';
}
}

View File

@ -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