Resource Interface
To be used as JSON:API resources, Doctrine entities must implement the Sowl\JsonApi\ResourceInterface
.
The interface requires to implement the 4 following methods:
getResourceType()
Defines the resource type
as part of the JSON:API Resource Object standard.
public static function getResourceType(): string
{
return 'users';
}
getId()
Returns the resource id
as part of the JSON:API Resource Object stadard.
public function getId(): int
{
return $this->id;
}
transformer()
Returns a new transformer instance.
public static function transformer(): AbstractTransformer
{
return new UserTransformer();
}
This Package uses Fractal for serialization of entities/resources as JSON:API responses.
Fractal Transformers Documentation
Transformer classes should extend the Sowl\JsonApi\AbstractTransformer
class.
relationships()
Returns the resource relationships.
public static function relationships(): RelationshipsCollection
{
return new RelationshipsCollection();
}
This method must return an instance of Sowl\JsonApi\Relationships\RelationshipsCollection
.
Two types of relationships exist, To-One
and To-Many
.
To-One Relationship
Returns a single resource in the responses.
// User Entity
public static function relationships(): RelationshipsCollection
{
return new RelationshipsCollection([
ToOneRelationship::create('country', Country::class)
]);
}
The ToOneRelationship::create()
method accepts 3 parameters:
name
(required):
Name of the relationship that will be used in the endpoint:
i.e: GET /user/1/{name}
or GET /user/1/relationships/{name}
i.e: GET /user/1/country
or GET /user/1/relationships/country
class
(required):
The entity (resource) class being the relation.
property
(optional):
Allow to set a custom value for the relation {name}
used in the endpoints.
For instance on the User
entity, if the relationship is set as protected Country $userCountry
, by default the endpoint would be GET /user/1/userCountry
.
// User Entity
public static function relationships(): RelationshipsCollection
{
return new RelationshipsCollection([
ToOneRelationship::create('userCountry', Country::class)
]);
}
Set the 1st required parameter name
as country
and set the 3rd optional parameter property
to userCountry
to have a custom endpoint like GET /user/1/country
.
// User Entity
public static function relationships(): RelationshipsCollection
{
return new RelationshipsCollection([
ToOneRelationship::create('country', Country::class, 'userCountry')
]);
}
To-Many Relationship
Returns a list of resources in the responses.
// User Entity
public static function relationships(): RelationshipsCollection
{
return new RelationshipsCollection([
ToManyRelationship::create('roles', Role::class, 'users')
]);
}
The ToManyRelationship::create()
method accepts 4 parameters:
name
(required):
Name of the relationship that will be used in the endpoint:
i.e: GET /user/1/{name}
or GET /user/1/relationships/{name}
i.e: GET /user/1/roles
or GET /user/1/relationships/roles
class
(required):
The entity (resource) class being the relation.
mappedBy
(required):
Name of the association-field on the owning side of the relation.
property
(optional):
Allow to set a custom value for the relation {name}
used in the endpoints.
For instance on the User
entity, if the relationship is set as protected Country $userRoles
, by default the endpoint would be GET /user/1/userRoles
.
// User Entity
public static function relationships(): RelationshipsCollection
{
return new RelationshipsCollection([
ToManyRelationship::create('userRoles', Role::class)
]);
}
Set the 1st required parameter name
as roles
and set the 3rd optional parameter property
to userRoles
to have a custom endpoint like GET /user/1/roles
.
// User Entity
public static function relationships(): RelationshipsCollection
{
return new RelationshipsCollection([
ToManyRelationship::create('roles', Role::class, 'userRoles')
]);
}
Memoize Relationships
The memoize pattern allows to build the relationships list once and to save it in memory.
public static function relationships(): RelationshipsCollection
{
return static::memoizeRelationships(fn () => [
ToOneRelationship::create('user', User::class),
ToManyRelationship::create('roles', Role::class, 'users'),
]);
}
To use this pattern, Doctrine entities must implement the Sowl\JsonApi\Relationships\MemoizeRelationshipsTrait
trait.