I'm building an API with API Platform under Symfony4,
I want to hide an entity in the doc which is accessible only to the ROLE_ADMIN of the blow no interest to be visible in the doc.
Here is the entity I want to hide:
<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiResource;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* @ApiResource(
* attributes={"access_control"="is_granted('ROLE_ADMIN')"}
* )
* @ORM\Entity(repositoryClass="App\Repository\OrderStatusRepository")
*/
class OrderStatus
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
* @Groups("orderGET")
*/
private $label;
/**
* @return int|null
*/
public function getId(): ?int
{
return $this->id;
}
/**
* @return null|string
*/
public function getLabel(): ?string
{
return $this->label;
}
/**
* @param string $label
* @return OrderStatus
*/
public function setLabel(string $label): self
{
$this->label = $label;
return $this;
}
}
Thank you for your help
Symfony allows to decorate services, here we need to decorate api_platform.openapi.factory
Create src/OpenApi/OpenApiFactory.php
with the following:
<?php
namespace App\OpenApi;
use ApiPlatform\Core\OpenApi\Factory\OpenApiFactoryInterface;
use ApiPlatform\Core\OpenApi\Model\PathItem;
use ApiPlatform\Core\OpenApi\OpenApi;
class OpenApiFactory implements OpenApiFactoryInterface
{
/**
* @var OpenApiFactoryInterface
*/
private $decorated;
public function __construct(OpenApiFactoryInterface $decorated)
{
$this->decorated = $decorated;
}
public function __invoke(array $context = []): OpenApi
{
$openApi = $this->decorated->__invoke($context);
/** @var PathItem $path */
foreach ($openApi->getPaths()->getPaths() as $key => $path) {
if ($path->getGet() && $path->getGet()->getSummary() === 'hidden') {
$openApi->getPaths()->addPath($key, $path->withGet(null));
}
}
return $openApi;
}
}
Register it
services:
App\OpenApi\OpenApiFactory:
decorates: 'api_platform.openapi.factory'
arguments: ['@App\OpenApi\OpenApiFactory.inner']
autoconfigure: false
Add openapi_context
to each route you want to hide
* @ApiResource(
* itemOperations={
* "get"={
* ...
* "openapi_context"={
* "summary"="hidden"
* }
* }
* }
* )
This isn't supported out of the box (but it would be a nice contribution).
What you can do is to decorate the DocumentationNormalizer
to unset()
the paths you don't want to appear in the OpenAPI documentation.
More information about overriding the specification in the API Platform OpenAPI documentation
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With