diff --git a/DependencyInjection/EXSystApiDocExtension.php b/DependencyInjection/EXSystApiDocExtension.php index 6d2fc06..7aef328 100644 --- a/DependencyInjection/EXSystApiDocExtension.php +++ b/DependencyInjection/EXSystApiDocExtension.php @@ -13,6 +13,7 @@ namespace EXSyst\Bundle\ApiDocBundle\DependencyInjection; use Nelmio\ApiDocBundle\Annotation\ApiDoc; use phpDocumentor\Reflection\DocBlockFactory; +use Swagger\Annotations\Swagger; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; @@ -40,10 +41,13 @@ class EXSystApiDocExtension extends Extension // Removes useless services if (!class_exists(ApiDoc::class)) { - $container->removeDefinition('exsyst_api_doc.routing_extractors.nelmio_annotation'); + $container->removeDefinition('exsyst_api_doc.route_describers.nelmio_annotation'); } if (!class_exists(DocBlockFactory::class)) { - $container->removeDefinition('exsyst_api_doc.routing_extractors.php_doc'); + $container->removeDefinition('exsyst_api_doc.route_describers.php_doc'); + } + if (!class_exists(Swagger::class)) { + $container->removeDefinition('exsyst_api_doc.describers.swagger_php'); } } } diff --git a/Describer/ExternalDocDescriber.php b/Describer/ExternalDocDescriber.php new file mode 100644 index 0000000..10f74b1 --- /dev/null +++ b/Describer/ExternalDocDescriber.php @@ -0,0 +1,52 @@ +externalDoc = $externalDoc; + $this->strategy = $strategy; + } + + public function describe(Swagger $api) + { + $externalDoc = $this->getExternalDoc(); + $api->merge($externalDoc, $this->strategy); + } + + private function getExternalDoc(): array + { + if (is_callable($this->externalDoc)) { + return call_user_func($this->externalDoc); + } + + return $this->externalDoc; + } +} diff --git a/Describer/RouteDescriber.php b/Describer/RouteDescriber.php index 42668c3..74e892a 100644 --- a/Describer/RouteDescriber.php +++ b/Describer/RouteDescriber.php @@ -12,7 +12,7 @@ namespace EXSyst\Bundle\ApiDocBundle\Describer; use Doctrine\Common\Util\ClassUtils; -use EXSyst\Bundle\ApiDocBundle\Extractor\Routing\RouteExtractorInterface; +use EXSyst\Bundle\ApiDocBundle\RouteDescriber\RouteDescriberInterface; use gossi\swagger\Swagger; use Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser; use Symfony\Component\Routing\Route; @@ -34,7 +34,7 @@ class RouteDescriber implements DescriberInterface $this->routeDescribers = $routeDescribers; } - public function describe(Swagger $swagger) + public function describe(Swagger $api) { if (0 === count($this->routeDescribers)) { return; @@ -45,7 +45,7 @@ class RouteDescriber implements DescriberInterface if ($method = $this->getReflectionMethod($route->getDefault('_controller'))) { // Extract as many informations as possible about this route foreach ($this->routeDescribers as $describer) { - $describer->describe($swagger, $route, $method); + $describer->describe($api, $route, $method); } } } diff --git a/Describer/SwaggerPhpDescriber.php b/Describer/SwaggerPhpDescriber.php new file mode 100644 index 0000000..1c4b015 --- /dev/null +++ b/Describer/SwaggerPhpDescriber.php @@ -0,0 +1,46 @@ +projectPath = $projectPath; + $this->overwrite = $overwrite; + } + + public function describe(Swagger $api) + { + $annotation = \Swagger\scan($this->projectPath); + + $api->merge($this->normalize($annotation), $this->overwrite); + } + + private function normalize($annotation) + { + return json_decode(json_encode($annotation)); + } +} diff --git a/Resources/config/services.xml b/Resources/config/services.xml index 86fbf2d..3fe3636 100644 --- a/Resources/config/services.xml +++ b/Resources/config/services.xml @@ -9,6 +9,12 @@ + + %kernel.root_dir% + + + + diff --git a/RouteDescriber/NelmioAnnotationDescriber.php b/RouteDescriber/NelmioAnnotationDescriber.php index 7c3a344..e14d584 100644 --- a/RouteDescriber/NelmioAnnotationDescriber.php +++ b/RouteDescriber/NelmioAnnotationDescriber.php @@ -101,10 +101,10 @@ class NelmioAnnotationDescriber implements RouteDescriberInterface $items = $items->getItems(); } while ('[]' === substr($requirement, -2)); - $items->setType(Swagger::T_STRING); + $items->setType('string'); $items->setFormat($requirement); } else { - $parameter->setType(Swagger::T_STRING); + $parameter->setType('string'); $parameter->setFormat($requirement); } diff --git a/RouteDescriber/RouteMetadataDescriber.php b/RouteDescriber/RouteMetadataDescriber.php index 271d312..b0421a6 100644 --- a/RouteDescriber/RouteMetadataDescriber.php +++ b/RouteDescriber/RouteMetadataDescriber.php @@ -26,7 +26,7 @@ class RouteMetadataDescriber implements RouteDescriberInterface foreach ($route->getRequirements() as $parameterName => $requirement) { $parameter = $operation->getParameters()->get($parameterName, 'path'); $parameter->setRequired(true); - $parameter->setType(Swagger::T_STRING); + $parameter->setType('string'); $parameter->setFormat($requirement); } } diff --git a/Tests/Functional/Fixtures/SwaggerPhp/Info.php b/Tests/Functional/Fixtures/SwaggerPhp/Info.php new file mode 100644 index 0000000..29ede8c --- /dev/null +++ b/Tests/Functional/Fixtures/SwaggerPhp/Info.php @@ -0,0 +1,24 @@ +assertTrue($operation->getDeprecated()); } + public function testSwaggerPhpInfo() + { + $api = $this->getSwaggerDefinition(); + $info = $api->getInfo(); + + $this->assertEquals('My Awesome App', $info->getTitle()); + $this->assertEquals('1.3', $info->getVersion()); + } + private function getSwaggerDefinition() { static::createClient(); diff --git a/composer.json b/composer.json index 6ea2e92..66f9804 100644 --- a/composer.json +++ b/composer.json @@ -9,17 +9,18 @@ } ], "require": { - "php": ">=7.0", + "php": "^7.0", "symfony/framework-bundle": "^3.2@dev", - "gossi/swagger": "^0.2" + "exsyst/swagger": "dev-master" }, "require-dev": { - "symfony/browser-kit": "~2.8|~3.0", + "symfony/browser-kit": "^2.8|^3.0", "symfony/phpunit-bridge": "^3.2@dev", - "sensio/framework-extra-bundle": "~3.0", + "sensio/framework-extra-bundle": "^3.0", "nelmio/api-doc-bundle": "^2.0", "phpdocumentor/reflection-docblock": "^3.1", - "phpunit/phpunit": "^5.4" + "phpunit/phpunit": "^5.4", + "zircote/swagger-php": "^2.0" }, "suggest": { "nelmio/api-doc-bundle": "For using the ApiDoc annotation.",