Api Platform conference
Register now
Guides
Guide

Hook a Persistence Layer with a Processor

design
// src/App/ApiResource.php namespace App\ApiResource; use ApiPlatform\Metadata\ApiResource; use App\State\BookProcessor; use App\State\BookProvider;
We use a BookProcessor as the ApiResource::processor option.
#[ApiResource(processor: BookProcessor::class, provider: BookProvider::class)] class Book {  public function __construct(public string $id, public string $title)  {  } }  // src/App/State.php namespace App\State; use ApiPlatform\Metadata\Operation; use ApiPlatform\State\ProcessorInterface; use ApiPlatform\State\ProviderInterface; use App\ApiResource\Book; use Ramsey\Collection\CollectionInterface;
The BookProcessor is where we can handle a persistence layer. In this processor we’re storing the JSON representation of the book in a file.
final class BookProcessor implements ProcessorInterface {  /**  * @param Book $data  */  public function process($data, Operation $operation, array $uriVariables = [], array $context = []): Book  {  $id = $uriVariables['id'] ?? $data->id;  file_put_contents(sprintf('book-%s.json', $id), json_encode($data));  return $data;  } } final class BookProvider implements ProviderInterface {  public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?Book  {  if ($operation instanceof CollectionInterface) {  throw new \RuntimeException('Not supported.');  }  $file = sprintf('book-%s.json', $uriVariables['id']);  if (!file_exists($file)) {  return null;  }  $data = json_decode(file_get_contents($file));  return new Book($data->id, $data->title);  } }  // src/App/Playground.php namespace App\Playground; use Symfony\Component\HttpFoundation\Request; function request(): Request {  return Request::create(uri: '/books', method: 'POST', server: ['CONTENT_TYPE' => 'application/ld+json'], content: json_encode(['id' => '1', 'title' => 'API Platform rocks.'])); }

You can also help us improve this guide.

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

Copyright © 2023 Kévin Dunglas

Sponsored by Les-Tilleuls.coop