From 383fb78360235ea3b633d11ffd0486d909a6afff Mon Sep 17 00:00:00 2001 From: Guilhem Niot Date: Sun, 25 Sep 2022 21:32:09 +0200 Subject: [PATCH] Add Api-Platform 3.x support --- DependencyInjection/NelmioApiDocExtension.php | 2 +- Describer/ApiPlatformDescriber.php | 9 ++- Resources/config/api_platform.xml | 13 ++-- Tests/Describer/ApiPlatformDescriberTest.php | 2 +- Tests/Functional/Entity/Dummy.php | 49 ++------------ Tests/Functional/Entity/Dummy71.php | 60 +++++++++++++++++ Tests/Functional/Entity/Dummy81.php | 64 +++++++++++++++++++ Tests/Functional/TestKernel.php | 2 +- composer.json | 2 +- 9 files changed, 145 insertions(+), 58 deletions(-) create mode 100644 Tests/Functional/Entity/Dummy71.php create mode 100644 Tests/Functional/Entity/Dummy81.php diff --git a/DependencyInjection/NelmioApiDocExtension.php b/DependencyInjection/NelmioApiDocExtension.php index ce0d0e6..a95beb9 100644 --- a/DependencyInjection/NelmioApiDocExtension.php +++ b/DependencyInjection/NelmioApiDocExtension.php @@ -168,7 +168,7 @@ final class NelmioApiDocExtension extends Extension implements PrependExtensionI } // ApiPlatform support - if (isset($bundles['ApiPlatformBundle']) && class_exists('ApiPlatform\Core\Documentation\Documentation')) { + if (isset($bundles['ApiPlatformBundle']) && class_exists('ApiPlatform\Documentation\Documentation')) { $loader->load('api_platform.xml'); } diff --git a/Describer/ApiPlatformDescriber.php b/Describer/ApiPlatformDescriber.php index 88f092d..4936c48 100644 --- a/Describer/ApiPlatformDescriber.php +++ b/Describer/ApiPlatformDescriber.php @@ -11,14 +11,17 @@ namespace Nelmio\ApiDocBundle\Describer; -use ApiPlatform\Core\Documentation\Documentation; +use ApiPlatform\Documentation\DocumentationInterface; use ApiPlatform\Core\Swagger\Serializer\DocumentationNormalizer; +use ApiPlatform\OpenApi\Factory\OpenApiFactoryInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; final class ApiPlatformDescriber extends ExternalDocDescriber { - public function __construct(Documentation $documentation, NormalizerInterface $normalizer) + public function __construct(DocumentationInterface $documentation, NormalizerInterface $normalizer) { + // var_dump(get_class($documentation)); + // die(); if (!$normalizer->supportsNormalization($documentation, 'json')) { throw new \InvalidArgumentException(sprintf('Argument 2 passed to %s() must implement %s and support normalization of %s. The normalizer provided is an instance of %s.', __METHOD__, NormalizerInterface::class, Documentation::class, get_class($normalizer))); } @@ -27,7 +30,7 @@ final class ApiPlatformDescriber extends ExternalDocDescriber $documentation = (array) $normalizer->normalize( $documentation, null, - [DocumentationNormalizer::SPEC_VERSION => 3] + class_exists(DocumentationNormalizer::class) ? [DocumentationNormalizer::SPEC_VERSION => 3] : [] ); // TODO: remove this diff --git a/Resources/config/api_platform.xml b/Resources/config/api_platform.xml index 24d747c..8edbfe1 100644 --- a/Resources/config/api_platform.xml +++ b/Resources/config/api_platform.xml @@ -5,18 +5,17 @@ - - + + - - - - - + + + + diff --git a/Tests/Describer/ApiPlatformDescriberTest.php b/Tests/Describer/ApiPlatformDescriberTest.php index 03a113b..ffdef4b 100644 --- a/Tests/Describer/ApiPlatformDescriberTest.php +++ b/Tests/Describer/ApiPlatformDescriberTest.php @@ -11,7 +11,7 @@ namespace Nelmio\ApiDocBundle\Tests\Describer; -use ApiPlatform\Core\Documentation\Documentation; +use ApiPlatform\Documentation\Documentation; use ApiPlatform\Metadata\Resource\ResourceNameCollection; use Nelmio\ApiDocBundle\Describer\ApiPlatformDescriber; use OpenApi\Annotations\OpenApi; diff --git a/Tests/Functional/Entity/Dummy.php b/Tests/Functional/Entity/Dummy.php index 1a07b9a..e74c70f 100644 --- a/Tests/Functional/Entity/Dummy.php +++ b/Tests/Functional/Entity/Dummy.php @@ -12,48 +12,9 @@ namespace Nelmio\ApiDocBundle\Tests\Functional\Entity; use ApiPlatform\Core\Annotation\ApiProperty; -use ApiPlatform\Core\Annotation\ApiResource; -use Symfony\Component\Validator\Constraints as Assert; -/** - * @author Guilhem N. - * - * @ApiResource( - * collectionOperations={ - * "get"={"method"="GET"}, - * "custom2"={"path"="/foo", "method"="GET"}, - * "custom"={"path"="/foo", "method"="POST"}, - * }, - * itemOperations={"get"={"method"="GET"}}) - * ) - */ -class Dummy -{ - /** - * @var int - */ - private $id; - - /** - * @var string - * - * @Assert\NotBlank - * @ApiProperty(iri="http://schema.org/name") - */ - private $name; - - public function getId(): int - { - return $this->id; - } - - public function setName(string $name) - { - $this->name = $name; - } - - public function getName(): string - { - return $this->name; - } -} +if (!class_exists(ApiProperty::class)) { + class_alias(Dummy81::class, Dummy::class); +} else { + class_alias(Dummy71::class, Dummy::class); +} \ No newline at end of file diff --git a/Tests/Functional/Entity/Dummy71.php b/Tests/Functional/Entity/Dummy71.php new file mode 100644 index 0000000..ef05cdc --- /dev/null +++ b/Tests/Functional/Entity/Dummy71.php @@ -0,0 +1,60 @@ + + * + * @ApiResource( + * shortName="Dummy", + * collectionOperations={ + * "get"={"method"="GET"}, + * "custom2"={"path"="/foo", "method"="GET"}, + * "custom"={"path"="/foo", "method"="POST"}, + * }, + * itemOperations={"get"={"method"="GET"}}) + * ) + */ +class Dummy71 +{ + /** + * @var int + */ + private $id; + + /** + * @var string + * + * @Assert\NotBlank + * @ApiProperty(iri="http://schema.org/name") + */ + private $name; + + public function getId(): int + { + return $this->id; + } + + public function setName(string $name) + { + $this->name = $name; + } + + public function getName(): string + { + return $this->name; + } +} diff --git a/Tests/Functional/Entity/Dummy81.php b/Tests/Functional/Entity/Dummy81.php new file mode 100644 index 0000000..2f24947 --- /dev/null +++ b/Tests/Functional/Entity/Dummy81.php @@ -0,0 +1,64 @@ + + */ +#[ + ApiResource( + shortName: "Dummy", + operations: [ + new Get(name: "get"), + new Get(name: "custom2", uriTemplate: "/foo"), + new Post(name: "custom", uriTemplate: "/foo"), + new GetCollection(), + ], + ) +] +class Dummy81 +{ + /** + * @var int + */ + private $id; + + /** + * @var string + * + * @Assert\NotBlank + */ + #[ApiProperty(iris: ["http://schema.org/name"])] + private $name; + + public function getId(): int + { + return $this->id; + } + + public function setName(string $name) + { + $this->name = $name; + } + + public function getName(): string + { + return $this->name; + } +} diff --git a/Tests/Functional/TestKernel.php b/Tests/Functional/TestKernel.php index f6ca42d..15d9771 100644 --- a/Tests/Functional/TestKernel.php +++ b/Tests/Functional/TestKernel.php @@ -11,7 +11,7 @@ namespace Nelmio\ApiDocBundle\Tests\Functional; -use ApiPlatform\Core\Bridge\Symfony\Bundle\ApiPlatformBundle; +use ApiPlatform\Symfony\Bundle\ApiPlatformBundle; use Bazinga\Bundle\HateoasBundle\BazingaHateoasBundle; use FOS\RestBundle\FOSRestBundle; use Hateoas\Configuration\Embedded; diff --git a/composer.json b/composer.json index 403be59..8f35aad 100644 --- a/composer.json +++ b/composer.json @@ -48,7 +48,7 @@ "symfony/twig-bundle": "^4.4|^5.2|^6.0", "symfony/validator": "^4.4|^5.2|^6.0", - "api-platform/core": "^2.7.0", + "api-platform/core": "^2.7.0|^3@dev", "symfony/deprecation-contracts": "^2.1|^3", "friendsofsymfony/rest-bundle": "^2.8|^3.0",