Skip to content

Commit beb3984

Browse files
author
Amrouche Hamza
committed
feat: add console commands
1 parent 6def19c commit beb3984

File tree

16 files changed

+81
-695
lines changed

16 files changed

+81
-695
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the API Platform project.
5+
*
6+
* (c) Kévin Dunglas <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace ApiPlatform\Core\Bridge\Symfony\Bundle\Command;
13+
14+
use ApiPlatform\Core\Swagger\ApiDocumentationBuilder;
15+
use Symfony\Component\Console\Command\Command;
16+
use Symfony\Component\Console\Input\InputInterface;
17+
use Symfony\Component\Console\Output\OutputInterface;
18+
19+
/**
20+
* Console command to dump Swagger API documentations.
21+
*
22+
* @author Amrouche Hamza <[email protected]>
23+
*/
24+
class SwaggerCommand extends Command
25+
{
26+
/**
27+
* @var ApiDocumentationBuilder
28+
*/
29+
protected $apiDocumentationBuilder;
30+
31+
public function __construct(ApiDocumentationBuilder $apiDocumentationBuilder)
32+
{
33+
$this->apiDocumentationBuilder = $apiDocumentationBuilder;
34+
35+
parent::__construct();
36+
}
37+
38+
protected function configure()
39+
{
40+
$this
41+
->setName('api:swagger:export')
42+
->setDescription('Export a beautiful json of swagger api');
43+
}
44+
45+
protected function execute(InputInterface $input, OutputInterface $output)
46+
{
47+
$data = $this->apiDocumentationBuilder->getApiDocumentation();
48+
$content = json_encode($data, JSON_PRETTY_PRINT);
49+
$output->writeln($content);
50+
}
51+
}

src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ public function load(array $configs, ContainerBuilder $container)
8282
$loader->load('api.xml');
8383
$loader->load('metadata.xml');
8484
$loader->load('data_provider.xml');
85+
$loader->load('swagger.xml');
8586

8687
$this->enableJsonLd($loader);
8788
$this->registerAnnotationLoaders($container);
@@ -110,15 +111,14 @@ public function load(array $configs, ContainerBuilder $container)
110111
}
111112

112113
/**
113-
* Enables JSON-LD and Hydra and Swagger support.
114+
* Enables JSON-LD and Hydra support.
114115
*
115116
* @param XmlFileLoader $loader
116117
*/
117118
private function enableJsonLd(XmlFileLoader $loader)
118119
{
119120
$loader->load('jsonld.xml');
120121
$loader->load('hydra.xml');
121-
$loader->load('swagger.xml');
122122
}
123123

124124
/**

src/Bridge/Symfony/Bundle/Resources/config/hydra.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
<tag name="kernel.event_listener" event="kernel.response" method="onKernelResponse" />
2828
</service>
2929

30-
<service id="api_platform.hydra.listener.validation_exception" class="ApiPlatform\Core\Bridge\Symfony\Validator\Hydra\EventListener\HydraExceptionListener">
30+
<service id="api_platform.hydra.listener.validation_exception" class="ApiPlatform\Core\Bridge\Symfony\Validator\Hydra\EventListener\ValidationExceptionListener">
3131
<argument type="service" id="api_platform.hydra.normalizer.constraint_violation_list" />
3232

3333
<tag name="kernel.event_listener" event="kernel.exception" method="onKernelException" />

src/Bridge/Symfony/Bundle/Resources/config/swagger.xml

Lines changed: 3 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -20,63 +20,9 @@
2020
<argument>%api_platform.description%</argument>
2121
</service>
2222

23-
<!-- Event listeners -->
24-
25-
<service id="api_platform.swagger.listener.link_header_response" class="ApiPlatform\Core\Swagger\EventListener\SwaggerLinkHeaderResponseListener">
26-
<argument type="service" id="api_platform.router" />
27-
28-
<tag name="kernel.event_listener" event="kernel.response" method="onKernelResponse" />
29-
</service>
30-
31-
<service id="api_platform.hydra.listener.validation_exception" class="ApiPlatform\Core\Bridge\Symfony\Validator\Swagger\EventListener\SwaggerValidationExceptionListener">
32-
<argument type="service" id="api_platform.hydra.normalizer.constraint_violation_list" />
33-
34-
<tag name="kernel.event_listener" event="kernel.exception" method="onKernelException" />
35-
</service>
36-
37-
<service id="api_platform.swagger.listener.request_exception" class="ApiPlatform\Core\Swagger\EventListener\RequestExceptionListener">
38-
<argument>api_platform.hydra.action.exception</argument>
39-
<argument type="service" id="logger" on-invalid="null" />
40-
41-
<tag name="kernel.event_listener" event="kernel.exception" method="onKernelException" priority="-96" />
42-
<tag name="monolog.logger" channel="request" />
43-
</service>
44-
45-
<!-- Serializer -->
46-
47-
<service id="api_platform.swagger.normalizer.collection" class="ApiPlatform\Core\Swagger\Serializer\CollectionNormalizer" public="false">
48-
<argument type="service" id="api_platform.metadata.resource.metadata_factory" />
49-
<argument type="service" id="api_platform.jsonld.context_builder" />
50-
<argument type="service" id="api_platform.resource_class_resolver" />
51-
<argument type="service" id="api_platform.iri_converter" />
52-
53-
<tag name="serializer.normalizer" priority="50" />
54-
</service>
55-
56-
<service id="api_platform.swagger.normalizer.constraint_violation_list" class="ApiPlatform\Core\Bridge\Symfony\Validator\Serializer\ConstraintViolationListNormalizer" public="false">
57-
<argument type="service" id="api_platform.router" />
58-
59-
<tag name="serializer.normalizer" />
60-
</service>
61-
62-
<service id="api_platform.swagger.normalizer.error" class="ApiPlatform\Core\Swagger\Serializer\SwaggerErrorNormalizer" public="false">
63-
<argument type="service" id="api_platform.router" />
64-
<argument>%kernel.debug%</argument>
65-
66-
<tag name="serializer.normalizer" />
67-
</service>
68-
69-
<service id="api_platform.swagger.normalizer.partial_collection_view" class="ApiPlatform\Core\Swagger\Serializer\PartialCollectionViewNormalizer" decorates="api_platform.hydra.normalizer.collection" public="false">
70-
<argument type="service" id="api_platform.swagger.normalizer.partial_collection_view.inner" />
71-
<argument>%api_platform.collection.pagination.page_parameter_name%</argument>
72-
<argument>%api_platform.collection.pagination.enabled_parameter_name%</argument>
73-
</service>
74-
75-
<service id="api_platform.swagger.normalizer.collection_filters" class="ApiPlatform\Core\Swagger\Serializer\CollectionFiltersNormalizer" decorates="api_platform.hydra.normalizer.collection" public="false">
76-
<argument type="service" id="api_platform.swagger.normalizer.collection_filters.inner" />
77-
<argument type="service" id="api_platform.metadata.resource.metadata_factory" />
78-
<argument type="service" id="api_platform.resource_class_resolver" />
79-
<argument type="service" id="api_platform.filters" />
23+
<service id="api_platform.swagger.command.swagger_command" class="ApiPlatform\Core\Bridge\Symfony\Bundle\Command\SwaggerCommand">
24+
<argument type="service" id="api_platform.swagger.documentation_builder" />
25+
<tag name="console.command" />
8026
</service>
8127

8228
<!-- Action -->
@@ -85,10 +31,6 @@
8531
<argument type="service" id="api_platform.swagger.documentation_builder" />
8632
</service>
8733

88-
<service id="api_platform.swagger.action.exception" class="ApiPlatform\Core\Swagger\Action\ExceptionAction">
89-
<argument type="service" id="api_platform.swagger.normalizer.error" />
90-
</service>
91-
9234
</services>
9335

9436
</container>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
*
2222
* @author Kévin Dunglas <[email protected]>
2323
*/
24-
final class HydraValidationExceptionListener
24+
final class ValidationExceptionListener
2525
{
2626
private $normalizer;
2727

src/Bridge/Symfony/Validator/Serializer/ConstraintViolationListNormalizer.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
*/
2323
final class ConstraintViolationListNormalizer implements NormalizerInterface
2424
{
25-
const FORMAT = ['swagger-error', 'hydra-error'];
25+
const FORMAT = ['hydra-error'];
2626

2727
/**
2828
* @var UrlGeneratorInterface

src/Hydra/ApiDocumentationBuilder.php

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceNameCollectionFactoryInterface;
2323
use ApiPlatform\Core\Metadata\Resource\ResourceMetadata;
2424
use ApiPlatform\Core\Util\ApiDocumentationBuilderInterface;
25+
use Symfony\Component\PropertyInfo\Type;
2526

2627
/**
2728
* Creates a machine readable Hydra API documentation.
@@ -366,32 +367,32 @@ private function getRange(PropertyMetadata $propertyMetadata)
366367
}
367368

368369
switch ($type->getBuiltinType()) {
369-
case 'string':
370-
return 'xmls:string';
370+
case Type::BUILTIN_TYPE_STRING:
371+
return 'string';
371372

372-
case 'int':
373-
return 'xmls:integer';
373+
case Type::BUILTIN_TYPE_INT:
374+
return 'integer';
374375

375-
case 'float':
376-
return 'xmls:double';
376+
case Type::BUILTIN_TYPE_FLOAT:
377+
return 'number';
377378

378-
case 'bool':
379-
return 'xmls:boolean';
379+
case Type::BUILTIN_TYPE_BOOL:
380+
return 'boolean';
380381

381-
case 'object':
382+
case Type::BUILTIN_TYPE_OBJECT:
382383
$className = $type->getClassName();
383384

384385
if ($className) {
385-
if ('DateTime' === $className) {
386-
return 'xmls:dateTime';
386+
if (is_subclass_of($className, \DateTimeInterface::class)) {
387+
return 'string';
387388
}
388389

389390
$className = $type->getClassName();
390391
if ($this->resourceClassResolver->isResourceClass($className)) {
391-
return sprintf('#%s', $this->resourceMetadataFactory->create($className)->getShortName());
392+
return ['$ref' => sprintf('#/definitions/%s', $this->resourceMetadataFactory->create($className)->getShortName())];
392393
}
393394
}
394-
break;
395+
break;
395396
}
396397
}
397398

src/Swagger/Action/ExceptionAction.php

Lines changed: 0 additions & 58 deletions
This file was deleted.

src/Swagger/ApiDocumentationBuilder.php

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceNameCollectionFactoryInterface;
2424
use ApiPlatform\Core\Metadata\Resource\ResourceMetadata;
2525
use ApiPlatform\Core\Util\ApiDocumentationBuilderInterface;
26+
use Symfony\Component\PropertyInfo\Type;
2627

2728
/**
2829
* Creates a machine readable Swagger API documentation.
@@ -144,7 +145,7 @@ public function getApiDocumentation()
144145
if ('' !== $this->description) {
145146
$doc['info']['description'] = $this->description;
146147
}
147-
$doc['host'] = $_SERVER['HTTP_HOST'];
148+
$doc['host'] = $this->urlGenerator->generate('api_jsonld_entrypoint');
148149
$doc['basePath'] = $this->urlGenerator->generate('api_jsonld_entrypoint');
149150
$doc['definitions'] = $properties;
150151
$doc['externalDocs'] = ['description' => 'Find more about api-platform', 'url' => 'docs'];
@@ -256,26 +257,23 @@ private function getRange(PropertyMetadata $propertyMetadata)
256257
}
257258

258259
switch ($type->getBuiltinType()) {
259-
case 'string':
260+
case Type::BUILTIN_TYPE_STRING:
260261
return 'string';
261262

262-
case 'int':
263+
case Type::BUILTIN_TYPE_INT:
263264
return 'integer';
264265

265-
case 'float':
266+
case Type::BUILTIN_TYPE_FLOAT:
266267
return 'number';
267268

268-
case 'double':
269-
return 'number';
270-
271-
case 'bool':
269+
case Type::BUILTIN_TYPE_BOOL:
272270
return 'boolean';
273271

274-
case 'object':
272+
case Type::BUILTIN_TYPE_OBJECT:
275273
$className = $type->getClassName();
276274

277275
if ($className) {
278-
if ('DateTime' === $className) {
276+
if (is_subclass_of($className, \DateTimeInterface::class)) {
279277
return 'string';
280278
}
281279

src/Swagger/EventListener/RequestExceptionListener.php

Lines changed: 0 additions & 34 deletions
This file was deleted.

0 commit comments

Comments
 (0)