1. Go to this page and download the library: Download undabot/json-api-symfony library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
undabot / json-api-symfony example snippets
/** @ResourceType(type="articles") */
final class ArticleWriteModel implements ApiModel
declare(strict_types=1);
namespace App;
use Undabot\SymfonyJsonApi\Model\ApiModel;
use Undabot\SymfonyJsonApi\Model\Resource\Annotation\Attribute;
use Undabot\SymfonyJsonApi\Model\Resource\Annotation\ToMany;
use Undabot\SymfonyJsonApi\Model\Resource\Annotation\ToOne;
use Undabot\SymfonyJsonApi\Service\Resource\Validation\Constraint\ResourceType;
/** @ResourceType(type="articles") */
final class ArticleWriteModel implements ApiModel
{
public function __construct(
public readonly string $id,
/** @Attribute */
public readonly string $title,
/** @ToOne(name="author", type="authors") */
public readonly string $authorId,
/**
* @var array<int,string>
* @ToMany(name="comments", type="comments")
*/
public readonly array $commentIds,
) {
}
}
declare(strict_types=1);
namespace App;
use Undabot\JsonApi\Definition\Model\Request\CreateResourceRequestInterface;
use Undabot\SymfonyJsonApi\Http\Model\Response\ResourceCreatedResponse;
use Undabot\SymfonyJsonApi\Http\Service\SimpleResourceHandler;
class Controller
{
public function create(
CreateResourceRequestInterface $request,
SimpleResourceHandler $resourceHandler,
Responder $responder,
): ResourceCreatedResponse {
/** @var ArticleWriteModel $articleWriteModel */
$articleWriteModel = $resourceHandler->getModelFromRequest(
$request,
ArticleWriteModel::class,
);
// now you can use something like
$articleWriteModel->title;
return $responder->resourceCreated($article, $
declare(strict_types=1);
namespace App;
use Undabot\JsonApi\Definition\Model\Request\UpdateResourceRequestInterface;
use Undabot\SymfonyJsonApi\Http\Model\Response\ResourceUpdatedResponse;
use Undabot\SymfonyJsonApi\Http\Service\SimpleResourceHandler;
use Undabot\SymfonyJsonApi\Service\Resource\Factory\ResourceFactory;
class Controller
{
public function update(
ArticleId $id,
UpdateResourceRequestInterface $request,
SimpleResourceHandler $resourceHandler,
Responder $responder,
ResourceFactory $resourceFactory,
): ResourceUpdatedResponse {
$article = // fetch article by id
$baseModel = ArticleWriteModel::fromEntity($article);
$baseResource = $resourceFactory->make($baseModel);
$updateResource = new CombinedResource($baseResource, $request->getResource());
/** @var ArticleWriteModel $articleUpdateModel */
$articleUpdateModel = $resourceHandler->getModelFromResource(
$updateResource,
ArticleWriteModel::class,
);
// now you can use something like
$articleUpdateModel->title;
return $responder->resourceUpdated($article, $
declare(strict_types=1);
namespace App;
use Undabot\SymfonyJsonApi\Model\ApiModel;
use Undabot\SymfonyJsonApi\Model\Resource\Annotation\Attribute;
use Undabot\SymfonyJsonApi\Model\Resource\Annotation\ToMany;
use Undabot\SymfonyJsonApi\Model\Resource\Annotation\ToOne;
use Undabot\SymfonyJsonApi\Service\Resource\Validation\Constraint\ResourceType;
/** @ResourceType(type="articles") */
final class ArticleModel implements ApiModel
{
public function __construct(
public readonly string $id,
/** @Attribute */
public readonly string $title,
/** @ToOne(name="author", type="authors") */
public readonly string $authorId,
/**
* @var array<int,string>
* @ToMany(name="comments", type="comments")
*/
public readonly array $commentIds,
) {
}
public static function fromSomething(Article $article): self
{
return new self(
(string) $article->id(),
(string) $article->title(),
(string) $article->author()->id(),
$article->comments()->map(static function (Comment $comment): string {
return (string) $comment->id();
})->toArray(),
);
}
}
public static function fromEntity(Article $article): self
{
$viewModel = $article->viewModel();
return new self(
$viewModel->id,
$viewModel->title,
$viewModel->authorId,
$viewModel->commentIds,
);
}
declare(strict_types=1);
namespace App;
use App\Article;
use App\Comment;
use Undabot\SymfonyJsonApi\Model\ApiModel;
use Undabot\SymfonyJsonApi\Model\Resource\Annotation\Attribute;
use Undabot\SymfonyJsonApi\Model\Resource\Annotation\ToMany;
use Undabot\SymfonyJsonApi\Model\Resource\Annotation\ToOne;
use Undabot\SymfonyJsonApi\Service\Resource\Validation\Constraint\ResourceType;
/** @ResourceType(type="articles") */
final class ArticleReadModel implements ApiModel
{
public function __construct(
public readonly string $id,
/** @Attribute */
public readonly string $title,
/** @ToOne(name="author", type="authors") */
public readonly string $authorId,
/**
* @var array<int,string>
* @ToMany(name="comments", type="comments")
*/
public readonly array $commentIds,
) {
}
public static function fromSomething(Article $article): self
{
return new self(
(string) $article->id(),
(string) $article->title(),
(string) $article->author()->id(),
$article->comments()->map(static function (Comment $comment): string {
return (string) $comment->id();
})->toArray(),
);
}
}
declare(strict_types=1);
namespace App;
class Controller
{
public function get(
ArticleId $id,
Responder $responder,
): ResourceCollectionResponse {
$article = # fetch article by id
// use toArray() method since comments are a collection
return $responder->resource($article, $article->comments->toArray());
}
declare(strict_types=1);
namespace App;
use Undabot\SymfonyJsonApi\Model\Collection\UniqueCollection;
class Controller
{
public function list(
Responder $responder,
): ResourceCollectionResponse {
$articles = # fetch array of articles
$added
return $responder->resource($article, $
declare(strict_types=1);
namespace App;
use Undabot\JsonApi\Definition\Model\Request\GetResourceCollectionRequestInterface;
use Undabot\SymfonyJsonApi\Model\Collection\UniqueCollection;
class Controller
{
public function list(
GetResourceCollectionRequestInterface $request,
Responder $responder,
): ResourceCollectionResponse {
$request->allowIncluded(['author', 'comments']);
$articles = # fetch array of articles
$turn $responder->resource($article, $
declare(strict_types=1);
namespace App;
use Undabot\JsonApi\Definition\Model\Request\GetResourceCollectionRequestInterface;
use Undabot\SymfonyJsonApi\Model\Collection\UniqueCollection;
class Controller
{
public function list(
GetResourceCollectionRequestInterface $request,
Responder $responder,
): ResourceCollectionResponse {
$request->allowFilters(['author.id', 'comment.ids']); // we can name this whatever we want (this could be author and comments also).
$articles = $queryBus->handleQuery(new ArticlesQuery(
$request->getFilterSet()?->getFilterValue('author.id'),
$request->getFilterSet()?->getFilterValue('comment.ids'),
));
return $responder->resource($article, $
declare(strict_types=1);
namespace App;
use Undabot\JsonApi\Definition\Model\Request\GetResourceCollectionRequestInterface;
use Undabot\SymfonyJsonApi\Model\Collection\UniqueCollection;
class Controller
{
public function list(
GetResourceCollectionRequestInterface $request,
Responder $responder,
): ResourceCollectionResponse {
$pagination = $request->getPagination();
$articles = $queryBus->handleQuery(new ArticlesQuery(
$pagination?->getOffset(),
$pagination?->getSize(),
));
return $responder->resource($article, $
declare(strict_types=1);
namespace App;
use Undabot\JsonApi\Definition\Model\Request\GetResourceCollectionRequestInterface;
use Undabot\SymfonyJsonApi\Model\Collection\UniqueCollection;
class Controller
{
public function list(
GetResourceCollectionRequestInterface $request,
Responder $responder,
): ResourceCollectionResponse {
$request->allowSorting(['article.id', 'article.createdAt', 'author.name']); // this can be any string, e.g. createdAt, article-createdAt, article_createdAt, ...
$articles = $queryBus->handleQuery(new ArticlesQuery(
$request->getSortSet()?->getSortsArray(),
));
return $responder->resource($article, $
declare(strict_types=1);
namespace App;
use Undabot\JsonApi\Definition\Model\Request\GetResourceRequestInterface;
class Controller
{
public function get(
ArticleId $id,
Responder $responder,
GetResourceRequestInterface $request,
): ResourceCollectionResponse {
$request->allowFields(['title']);
// now it's up to you will you fetch resource with only given fields
// or you'll fetch entire resource and strip fields in read
// model (make separate read model for all fields combination)
$article = # fetch article by id
return $responder->resource($article);
}
declare(strict_types=1);
namespace App;
use Undabot\SymfonyJsonApi\Http\Service\Responder\AbstractResponder;
final class Responder extends AbstractResponder
{
/** {@inheritdoc} */
public function getMap(): array
{
return [
SomeClass::class => [SomeReadModel::class, 'fromSomething'],
];
}
}
declare(strict_types=1);
namespace App;
class Controller
{
public function get(
Responder $responder,
): ResourceResponse {
... # fetch single entity
return $responder->resource($singleEntity);
}
declare(strict_types=1);
namespace App;
class Controller
{
public function list(
Responder $responder,
): ResourceCollectionResponse {
... # fetch array of entities
return $responder->resourceCollection($entities);
}
public function resourceCollection(
array $primaryData,
array $esponse()
public function resourceObjectCollection(
ObjectCollection $primaryModels,
array $
public function resource(
$primaryData,
array $ourceResponse {
public function resourceCreated(
$primaryData,
array $eatedResponse
public function resourceUpdated(
$primaryData,
array $datedResponse
public function resourceDeleted(): ResourceDeletedResponse
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.