NelmioApiDocBundle/RouteDescriber/NelmioAnnotationDescriber.php

132 lines
4.6 KiB
PHP
Raw Normal View History

2016-06-30 23:30:37 +02:00
<?php
/*
* This file is part of the ApiDocBundle package.
*
* (c) EXSyst
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
2016-07-15 00:40:30 +02:00
namespace EXSyst\Bundle\ApiDocBundle\RouteDescriber;
2016-06-30 23:30:37 +02:00
use Doctrine\Common\Annotations\Reader;
2016-08-01 19:58:57 +02:00
use EXSyst\Component\Swagger\Parameter;
use EXSyst\Component\Swagger\Swagger;
2016-06-30 23:30:37 +02:00
use Nelmio\ApiDocBundle\Annotation\ApiDoc;
use Symfony\Component\Routing\Route;
2016-07-15 00:40:30 +02:00
class NelmioAnnotationDescriber implements RouteDescriberInterface
2016-06-30 23:30:37 +02:00
{
2016-07-15 00:40:30 +02:00
use RouteDescriberTrait;
2016-06-30 23:30:37 +02:00
private $annotationReader;
public function __construct(Reader $annotationReader)
{
$this->annotationReader = $annotationReader;
}
2016-07-15 00:40:30 +02:00
public function describe(Swagger $api, Route $route, \ReflectionMethod $reflectionMethod)
2016-06-30 23:30:37 +02:00
{
$annotation = $this->annotationReader->getMethodAnnotation($reflectionMethod, ApiDoc::class);
if (null === $annotation) {
return;
}
2016-07-12 00:33:55 +02:00
// some fields aren't available otherwise
$annotationArray = $annotation->toArray();
2016-07-13 23:05:14 +02:00
2016-06-30 23:30:37 +02:00
foreach ($this->getOperations($api, $route) as $operation) {
2016-08-04 22:27:10 +02:00
if (null === $operation->getDescription()) {
2016-06-30 23:30:37 +02:00
$operation->setDescription($annotation->getDescription());
}
2016-08-04 22:27:10 +02:00
if (null === $operation->getDeprecated() && $annotation->getDeprecated()) {
$operation->setDeprecated(true);
}
2016-06-30 23:30:37 +02:00
// Request parameters
foreach ($annotation->getParameters() as $name => $configuration) {
$parameter = $operation->getParameters()->get($name, 'formData');
2016-08-04 22:27:10 +02:00
if (isset($configuration['required']) && $configuration['required']) {
$parameter->setRequired(true);
2016-06-30 23:30:37 +02:00
}
$this->configureParameter($parameter, $configuration);
}
2016-08-04 22:27:10 +02:00
// Query/Path required parameters
$compiledRoute = $route->compile();
$pathVariables = $compiledRoute->getVariables();
$hostVariables = $compiledRoute->getHostVariables();
2016-06-30 23:30:37 +02:00
foreach ($annotation->getRequirements() as $name => $configuration) {
2016-08-04 22:27:10 +02:00
if (in_array($name, $pathVariables)) {
$in = 'path';
} elseif (!in_array($name, $hostVariables)) {
$in = 'query';
} else { // Host variables not supported
continue;
}
$parameter = $operation->getParameters()->get($name, $in);
2016-06-30 23:30:37 +02:00
$parameter->setRequired(true);
$this->configureParameter($parameter, $configuration);
}
2016-08-04 22:27:10 +02:00
// Optional Query parameters
2016-06-30 23:30:37 +02:00
foreach ($annotation->getFilters() as $name => $configuration) {
$parameter = $operation->getParameters()->get($name, 'query');
$this->configureParameter($parameter, $configuration);
}
// External docs
if (isset($annotationArray['link'])) {
$operation->getExternalDocs()->setUrl($annotationArray['link']);
}
// Responses
if (isset($annotationArray['statusCodes'])) {
$responses = $operation->getResponses();
foreach ($annotationArray['statusCodes'] as $statusCode => $description) {
$response = $responses->get($statusCode);
$response->setDescription($description);
}
}
}
}
private function configureParameter(Parameter $parameter, array $configuration)
{
$dataType = null;
if (isset($configuration['dataType'])) {
$dataType = $configuration['dataType'];
} elseif ($configuration['requirement']) {
$dataType = $configuration['requirement'];
}
if ('[]' === substr($requirement, -2)) {
$parameter->setType('array');
$items = $parameter;
do {
$items->setCollectionFormat('multi');
$requirement = substr($requirement, 0, -2);
$items = $items->getItems();
} while ('[]' === substr($requirement, -2));
2016-07-28 10:20:59 +02:00
$items->setType('string');
2016-06-30 23:30:37 +02:00
$items->setFormat($requirement);
} else {
2016-07-28 10:20:59 +02:00
$parameter->setType('string');
2016-06-30 23:30:37 +02:00
$parameter->setFormat($requirement);
}
if (isset($configuration['description'])) {
$parameter->setDescription($configuration['description']);
}
if (isset($configuration['default'])) {
$parameter->setDefault($configuration['default']);
}
}
}