Support references to config definitions (#1232)

* Support references to config definitions

* Add type hint

* Add a test
This commit is contained in:
Guilhem N 2018-02-19 10:49:52 +01:00 committed by GitHub
parent 8097a79d9c
commit 296c63d21c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 56 additions and 11 deletions

View File

@ -24,30 +24,31 @@ use Swagger\Annotations as SWG;
use Swagger\Context; use Swagger\Context;
use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\RouteCollection;
final class SwaggerPhpDescriber extends ExternalDocDescriber implements ModelRegistryAwareInterface final class SwaggerPhpDescriber implements ModelRegistryAwareInterface
{ {
use ModelRegistryAwareTrait; use ModelRegistryAwareTrait;
private $routeCollection; private $routeCollection;
private $controllerReflector; private $controllerReflector;
private $annotationReader; private $annotationReader;
private $overwrite;
public function __construct(RouteCollection $routeCollection, ControllerReflector $controllerReflector, Reader $annotationReader, bool $overwrite = false) public function __construct(RouteCollection $routeCollection, ControllerReflector $controllerReflector, Reader $annotationReader, bool $overwrite = false)
{ {
$this->routeCollection = $routeCollection; $this->routeCollection = $routeCollection;
$this->controllerReflector = $controllerReflector; $this->controllerReflector = $controllerReflector;
$this->annotationReader = $annotationReader; $this->annotationReader = $annotationReader;
$this->overwrite = $overwrite;
}
parent::__construct(function () { public function describe(Swagger $api)
$analysis = $this->getAnnotations(); {
$analysis = $this->getAnnotations($api);
$analysis->process($this->getProcessors()); $analysis->process($this->getProcessors());
$analysis->validate(); $analysis->validate();
return json_decode(json_encode($analysis->swagger), true); $api->merge(json_decode(json_encode($analysis->swagger), true), $this->overwrite);
}, $overwrite);
} }
private function getProcessors(): array private function getProcessors(): array
@ -60,9 +61,30 @@ final class SwaggerPhpDescriber extends ExternalDocDescriber implements ModelReg
return array_merge($processors, Analysis::processors()); return array_merge($processors, Analysis::processors());
} }
private function getAnnotations(): Analysis private function getAnnotations(Swagger $api): Analysis
{ {
$analysis = new Analysis(); $analysis = new Analysis();
$analysis->addAnnotation(new class($api) extends SWG\Swagger {
private $api;
public function __construct(Swagger $api)
{
$this->api = $api;
parent::__construct([]);
}
/**
* Support definitions from the config and reference to models.
*/
public function ref($ref)
{
if (0 === strpos($ref, '#/definitions/') && $this->api->getDefinitions()->has(substr($ref, 14))) {
return;
}
parent::ref($ref);
}
}, null);
$operationAnnotations = [ $operationAnnotations = [
'get' => SWG\Get::class, 'get' => SWG\Get::class,

View File

@ -181,4 +181,16 @@ class ApiController
public function symfonyConstraintsAction() public function symfonyConstraintsAction()
{ {
} }
/**
* @SWG\Response(
* response="200",
* description="Success",
* @SWG\Schema(ref="#/definitions/Test")
* )
* @Route("/configReference", methods={"GET"})
*/
public function configReferenceAction()
{
}
} }

View File

@ -301,4 +301,10 @@ class FunctionalTest extends WebTestCase
'type' => 'object', 'type' => 'object',
], $this->getModel('SymfonyConstraints')->toArray()); ], $this->getModel('SymfonyConstraints')->toArray());
} }
public function testConfigReference()
{
$operation = $this->getOperation('/api/configReference', 'get');
$this->assertEquals('#/definitions/Test', $operation->getResponses()->get('200')->getSchema()->getRef());
}
} }

View File

@ -49,7 +49,7 @@ class SwaggerUiTest extends WebTestCase
'responses' => ['200' => ['description' => 'Test']], 'responses' => ['200' => ['description' => 'Test']],
]], ]],
]; ];
$expected['definitions'] = ['Dummy' => $expected['definitions']['Dummy']]; $expected['definitions'] = ['Dummy' => $expected['definitions']['Dummy'], 'Test' => ['type' => 'string']];
yield ['/docs/test', 'test', $expected]; yield ['/docs/test', 'test', $expected];
} }

View File

@ -109,6 +109,11 @@ class TestKernel extends Kernel
'info' => [ 'info' => [
'title' => 'My Test App', 'title' => 'My Test App',
], ],
'definitions' => [
'Test' => [
'type' => 'string',
],
],
], ],
'areas' => [ 'areas' => [
'default' => ['path_patterns' => ['^/api(?!/admin)']], 'default' => ['path_patterns' => ['^/api(?!/admin)']],