Add PostParserInterface to JmsMetadataParser to get ValidatorParser found children parsed.

This commit is contained in:
Samuel ROZE 2013-11-07 16:17:23 +01:00
parent eddba56c66
commit 3f66888f00
5 changed files with 116 additions and 1 deletions

View File

@ -293,14 +293,24 @@ class ApiDocExtractor
// output (populates 'response' for the formatters) // output (populates 'response' for the formatters)
if (null !== $output = $annotation->getOutput()) { if (null !== $output = $annotation->getOutput()) {
$response = array(); $response = array();
$supportedParsers = array();
$normalizedOutput = $this->normalizeClassParameter($output); $normalizedOutput = $this->normalizeClassParameter($output);
foreach ($this->getParsers($normalizedOutput) as $parser) { foreach ($this->getParsers($normalizedOutput) as $parser) {
if ($parser->supports($normalizedOutput)) { if ($parser->supports($normalizedOutput)) {
$supportedParsers[] = $parser;
$response = $this->mergeParameters($response, $parser->parse($normalizedOutput)); $response = $this->mergeParameters($response, $parser->parse($normalizedOutput));
} }
} }
foreach($supportedParsers as $parser) {
if($parser instanceof PostParserInterface) {
$mp = $parser->postParse($normalizedOutput, $response);
$response = $this->mergeParameters($response, $mp);
}
}
$response = $this->clearClasses($response); $response = $this->clearClasses($response);
$annotation->setResponse($response); $annotation->setResponse($response);

View File

@ -22,7 +22,7 @@ use JMS\Serializer\Naming\PropertyNamingStrategyInterface;
/** /**
* Uses the JMS metadata factory to extract input/output model information * Uses the JMS metadata factory to extract input/output model information
*/ */
class JmsMetadataParser implements ParserInterface class JmsMetadataParser implements ParserInterface, PostParserInterface
{ {
/** /**
* @var \Metadata\MetadataFactoryInterface * @var \Metadata\MetadataFactoryInterface
@ -206,6 +206,40 @@ class JmsMetadataParser implements ParserInterface
return in_array($type, array('boolean', 'integer', 'string', 'float', 'double', 'array', 'DateTime')); return in_array($type, array('boolean', 'integer', 'string', 'float', 'double', 'array', 'DateTime'));
} }
/**
* {@inheritDoc}
*/
public function postParse(array $input, array $parameters)
{
return $this->doPostParse($parameters);
}
/**
* Recursive `doPostParse` to avoid circular post parsing.
*
* @param array $parameters
* @param array $visited
* @return array
*/
protected function doPostParse (array $parameters, array $visited = array())
{
foreach($parameters as $param => $data) {
if(isset($data['class']) && isset($data['children']) && !in_array($data['class'], $visited)) {
$visited[] = $data['class'];
$input = array('class' => $data['class'], 'groups' => isset($data['groups']) ? $data['groups'] : array());
$parameters[$param]['children'] = array_merge(
$parameters[$param]['children'], $this->doPostParse($parameters[$param]['children'], $visited)
);
$parameters[$param]['children'] = array_merge(
$parameters[$param]['children'], $this->doParse($input['class'], $visited, $input['groups'])
);
}
}
return $parameters;
}
/** /**
* Check the various ways JMS describes values in arrays, and * Check the various ways JMS describes values in arrays, and
* get the value type in the array * get the value type in the array

View File

@ -20,6 +20,11 @@ class MultipleTest
*/ */
public $baz; public $baz;
/**
* @JMS\Type("Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test")
*/
public $related;
/** /**
* @Assert\Type(type="array") * @Assert\Type(type="array")
* @Assert\All({ * @Assert\All({

View File

@ -489,6 +489,18 @@ number:
* type: DateTime * type: DateTime
related:
* type: object (Test)
related[a]:
* type: string
related[b]:
* type: DateTime
### `ANY` /z-return-selected-parsers-input ### ### `ANY` /z-return-selected-parsers-input ###
@ -536,6 +548,18 @@ objects[][b]:
number: number:
* type: DateTime * type: DateTime
related:
* type: object (Test)
related[a]:
* type: string
related[b]:
* type: DateTime
MARKDOWN; MARKDOWN;
$this->assertEquals($expected, $result); $this->assertEquals($expected, $result);

View File

@ -849,6 +849,27 @@ With multiple lines.',
'readonly' => null 'readonly' => null
) )
) )
),
'related' => array(
'dataType' => 'object (Test)',
'readonly' => false,
'required' => false,
'description' => '',
'sinceVersion' => null,
'untilVersion' => null,
'children' => array(
'a' => array(
'dataType' => 'string',
'format' => '{length: min: foo}, {not blank}',
'required' => true,
'readonly' => null
),
'b' => array(
'dataType' => 'DateTime',
'required' => null,
'readonly' => null
)
)
) )
), ),
'authenticationRoles' => array(), 'authenticationRoles' => array(),
@ -921,6 +942,27 @@ With multiple lines.',
'readonly' => null 'readonly' => null
) )
) )
),
'related' => array(
'dataType' => 'object (Test)',
'readonly' => false,
'required' => false,
'description' => '',
'sinceVersion' => null,
'untilVersion' => null,
'children' => array(
'a' => array(
'dataType' => 'string',
'format' => '{length: min: foo}, {not blank}',
'required' => true,
'readonly' => null
),
'b' => array(
'dataType' => 'DateTime',
'required' => null,
'readonly' => null
)
)
) )
), ),
'authenticationRoles' => array(), 'authenticationRoles' => array(),