I am trying to create a simple web app using Symfony 5. I am using the API.
Currently when calling some endpoint it only displays the IRI link to the related link:

I need instead to display the related entity object itself; if I get the Item endpoint the related entity Program should be returned this:
{
"id": 1,
"program": {
"id": 1,
"name": "First program"
},
"description": "fgdfg",
"comment": "dfgdfg"
{
So, this is how the table looks:

I thought setting up a subresource would be enough to get the object but it wasn’t:
In the
InventoryItementity configured@ApiSubresourceannotation of theProgramproperty:/** * @ORMManyToOne(targetEntity=Program::class, inversedBy="inventoryItems") * @ORMJoinColumn(nullable=false) * @ApiSubresource */ private $program;
In
resources.yamlfile I configured the subresource:AppEntityInventoryItem: properties: program: subresource: resourceClass: 'AppEntityProgram' collection: true
This still returns the IRI instead of the object, The only thing that has changed was that now I can access to the related entity for the current object in this URL: http://localhost:8000/api/inventory_items/1/program.json.
Any idea on how to return the related entity object itself instead of the IRI URL?
Advertisement
Answer
You’re searching to serialize your item. So I guess this is more a serialization problem than a sub-resource problem. I think you should use serialization group instead of SubResource.
SOLUTION1 Serialize the embedding relation
The “Embedding relation” provides an example with Book and Author.
<?php
// api/src/Entity/Item.php
namespace AppEntity;
use ApiPlatformCoreAnnotationApiResource;
use SymfonyComponentSerializerAnnotationGroups;
/**
* @ApiResource(normalizationContext={"groups"={"item"}})
*/
class Item
{
/**
* @Groups({"item"})
*/
public $description;
/**
* @Groups({"item"})
*/
public $comment;
/**
* @Groups({"item"})
*/
public $program;
// ...
}
// api/src/Entity/Person.php
namespace AppEntity;
use ApiPlatformCoreAnnotationApiResource;
use SymfonyComponentSerializerAnnotationGroups;
/**
* @ApiResource
*/
class Person
{
/**
* ...
* @Groups("item") <=== This is item, not program but you can have two groups
*/
public $name;
// ...
}
SOLUTION2 Mix subresources and serialization groups
This example should work, but (if subresources are necessary) you can mixed subresources and serializations too, but in you case I guess that the first solution is the best.