API Platform provides the possibility to extend the JSON-LD context of properties. This allows you to describe JSON-LD-typed
values, inverse properties using the @reverse
keyword and you can even overwrite the @id
property this way. Everything you define
within the following annotation will be passed to the context. This provides a generic way to extend the context.
<?php
// api/src/Entity/Book.php
namespace App\Entity;
use ApiPlatform\Metadata\ApiProperty;
use ApiPlatform\Metadata\ApiResource;
#[ApiResource(types: ['https://schema.org/Book'])]
class Book
{
// ...
#[ApiProperty(
types: ['https://schema.org/name'],
jsonldContext: [
'@id' => 'http://yourcustomid.com',
'@type' => 'http://www.w3.org/2001/XMLSchema#string',
'someProperty' => [
'a' => 'textA',
'b' => 'textB'
]
]
)]
public $name;
// ...
}
The generated context will now have your custom attributes set:
GET /contexts/Book
{
"@context": {
"@vocab": "http://example.com/apidoc#",
"hydra": "http://www.w3.org/ns/hydra/core#",
"name": {
"@id": "http://yourcustomid.com",
"@type": "http://www.w3.org/2001/XMLSchema#string",
"someProperty": {
"a": "textA",
"b": "textB"
}
}
}
}
Note that you do not have to provide the @id
attribute. If you do not provide an @id
attribute, the value from iri
will be used.
It’s also possible to replace the Hydra context used by the documentation generator:
<?php
// api/src/Entity/Book.php
namespace App\Entity;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Get;
#[ApiResource(operations: [
new Get(hydraContext: ['foo' => 'bar'])
])]
class Book
{
//...
}
# api/config/api_platform/resources.yaml
App\Entity\Book:
operations:
ApiPlatform\Metadata\Get:
hydraContext: { foo: 'bar' }
<?xml version="1.0" encoding="UTF-8" ?>
<!-- api/config/api_platform/resources.xml -->
<resources xmlns="https://api-platform.com/schema/metadata/resources-3.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://api-platform.com/schema/metadata/resources-3.0
https://api-platform.com/schema/metadata/resources-3.0.xsd">
<resource class="App\Entity\Book">
<operations>
<operation class="ApiPlatform\Metadata\Get">
<hydraContext>
<values>
<value name="foo">bar</value>
</values>
</hydraContext>
</operation>
</operations>
</resource>
</resources>
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