<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
coder-sapient / json-api-document-builder example snippets
final class ShowArticleAction
{
public function __construct(private SingleDocumentBuilder $builder)
{
}
public function __invoke(ShowArticleRequest $request): string
{
try {
$document = $this->builder->build($request->toQuery());
} catch (JsonApiException $e) {
return json_encode($e->jsonApiErrors());
}
return json_encode($document);
}
}
final class ShowArticleRequest extends Request
{
use SingleDocumentRequest;
protected function resourceId(): string
{
// return from URL ~/articles/{resourceId}
}
protected function resourceType(): string
{
return 'articles';
}
protected function acceptableIncludes(): array
{
return ['author', 'comments', 'comments.user'];
}
}
final class ListArticlesRequest extends Request
{
use DocumentsRequest;
protected function resourceType(): string
{
return 'articles';
}
protected function acceptableSorting(): array
{
return ['title', 'created_at'];
}
protected function acceptableIncludes(): array
{
return ['author', 'comments', 'comments.user'];
}
protected function acceptableFilters(): array
{
return [
'author_id' => ['eq'],
'title' => ['eq', 'like'],
];
}
}
interface ResourceResolverFactory
{
/**
* @throws ResourceResolverNotFoundException
*/
public function make(string $resourceType): ResourceResolver;
}
$factory = new InMemoryResourceResolverFactory();
$factory->add(
'articles', // resource type
new ArticleResourceResolver()
);
$factory->add(
'users',
new AuthorResourceResolver()
);
$factory->add(
'comments',
new CommentResourceResolver()
);
$builder = new SingleDocumentBuilder($factory, new InMemoryResourceCache());
$singleDocument = $builder->build($request->toQuery());
interface ResourceResolver
{
/**
* @param DocumentsQuery $query
*
* @return ResourceObject[]
*/
public function resolveMany(DocumentsQuery $query): array;
/**
* @param SingleDocumentQuery $query
*
* @return ResourceObject|null
*/
public function resolveOne(SingleDocumentQuery $query): ?ResourceObject;
/**
* @param string ...$resourceIds
*
* @return ResourceObject[]|PromiseInterface
*/
public function resolveByIds(string ...$resourceIds): array|PromiseInterface;
}
interface PaginationResolver
{
/**
* @param DocumentsQuery $query
*
* @return PaginationResponse
*/
public function paginate(DocumentsQuery $query): PaginationResponse;
}
interface ResourceCache
{
/**
* @param string $key
*
* @return ResourceObject|null
*/
public function getByKey(string $key): ?ResourceObject;
/**
* @return ResourceObject[]
*/
public function getByKeys(string ...$keys): array;
/**
* @param JsonApiQuery $query
*
* @return ResourceObject[]
*/
public function getByQuery(JsonApiQuery $query): array;
/**
* @param ResourceObject ...$resources
*
* @return void
*/
public function setByKeys(ResourceObject ...$resources): void;
/**
* @param JsonApiQuery $query
* @param ResourceObject ...$resources
*
* @return void
*/
public function setByQuery(JsonApiQuery $query, ResourceObject ...$resources): void;
/**
* @param string ...$keys
*
* @return void
*/
public function removeByKeys(string ...$keys): void;
/**
* @param string ...$resourceTypes
*
* @return void
*/
public function removeByTypes(string ...$resourceTypes): void;
/**
* @return void
*/
public function flush(): void;
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.