// src/App/ApiResource.php
namespace App\ApiResource;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\ApiProperty;
use ApiPlatform\Metadata\Get;
use ApiPlatform\Metadata\Operation;
#[ApiResource(
operations: [
new Get(provider: Book::class.'::provide'),
],
)]
class Book
{
#[ApiProperty(identifier: true)]
public string $id = "unique-id-1";
public static function provide(Operation $operation, array $uriVariables = [], array $context = []): object|array|null
{
return (new self());
}
}
// src/App/Service.php
namespace App\Service;
use ApiPlatform\Serializer\TagCollectorInterface;
use App\ApiResource\Book;
class TagCollector implements TagCollectorInterface
{
public function collect(array $context = []): void
{
if (isset($context['property_metadata'])) {
return;
}
$iri = $context['iri'] ?? null;
$object = $context['object'] ?? null;
if ($object && $object instanceof Book) {
$iri = $object->id;
}
if (!$iri) {
return;
}
$context['resources'][$iri] = $iri;
}
}
// src/App/DependencyInjection.php
namespace App\DependencyInjection;
use App\Service\TagCollector;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
function configure(ContainerConfigurator $configurator): void
{
$services = $configurator->services();
$services->set('api_platform.http_cache.tag_collector', TagCollector::class);
}
// src/App/Playground.php
namespace App\Playground;
use Symfony\Component\HttpFoundation\Request;
function request(): Request
{
return Request::create('/books/unique-id-1.jsonld', 'GET');
}
// src/App/Tests.php
namespace App\Tests;
use ApiPlatform\Playground\Test\TestGuideTrait;
use ApiPlatform\Symfony\Bundle\Test\ApiTestCase;
final class BookTest extends ApiTestCase
{
use TestGuideTrait;
public function testAsAnonymousICanAccessTheDocumentation(): void
{
$response = static::createClient()->request('GET', '/books/unique-id-1.jsonld');
$this->assertResponseIsSuccessful();
$this->assertResponseHeaderSame('Cache-Tags', 'unique-id-1');
$this->assertJsonContains([
'@id' => '/books/unique-id-1',
'@type' => 'Book',
'id' => 'unique-id-1',
]);
}
}
Made with love by
Les-Tilleuls.coop can help you design and develop your APIs and web projects, and train your teams in API Platform, Symfony, Next.js, Kubernetes and a wide range of other technologies.
Learn more