PHP code example of ark4ne / laravel-json-api
1. Go to this page and download the library: Download ark4ne/laravel-json-api 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/ */
ark4ne / laravel-json-api example snippets
use \Ark4ne\JsonApi\Requests\Rules\Includes;
use \Illuminate\Foundation\Http\FormRequest;
class UserFetchRequest extends FormRequest
{
public function rules()
{
return [
'
use \Ark4ne\JsonApi\Requests\Rules\Fields;
use \Illuminate\Foundation\Http\FormRequest;
class UserFetchRequest extends FormRequest
{
public function rules()
{
return [
'fields' => [new Fields(UserResource::class)],
]
}
}
protected function toType(Request $request): string;
protected function toIdentifier(Request $request): int|string;
protected function toAttributes(Request $request): iterable;
protected function toRelationships(Request $request): iterable;
protected function toResourceMeta(Request $request): ?iterable;
protected function toMeta(Request $request): ?iterable;
use Ark4ne\JsonApi\Resources\JsonApiResource;
use Illuminate\Http\Request;
class UserResource extends JsonApiResource
{
protected function toAttributes(Request $request): iterable
{
return [
'name' => $this->name,
'email' => $this->email,
];
}
protected function toResourceMeta(Request $request): ?iterable
{
return [
'created_at' => $this->created_at->format(DateTimeInterface::ATOM),
'updated_at' => $this->updated_at->format(DateTimeInterface::ATOM),
];
}
protected function toRelationships(Request $request): iterable
{
return [
'posts' => PostResource::relationship(fn() => $this->posts, fn() => [
'self' => "https://api.example.com/user/{$this->id}/relationships/posts",
'related' => "https://api.example.com/user/{$this->id}/posts",
]),
'comments' => CommentResource::relationship(fn() => $this->whenLoaded('comments')),
];
}
}
protected function toType(Request $request): string
{
return 'user';
}
protected function toIdentifier(Request $request): int|string
{
return $this->id;
}
protected function toAttributes(Request $request): iterable
{
return [
'name' => $this->name,
'email' => $this->email,
];
}
protected function toAttributes(Request $request): array
{
return [
'name' => $this->name,
'email' => $this->email,
// with lazy evaluation
'hash64' => fn() => base64_encode("{$this->id}-{$this->email}"),
// Conditional attribute
'secret' => $this->when($request->user()->isAdmin(), 'secret-value'),
// Merging Conditional Attributes
// use applyWhen insteadof mergeWhen for keep fields
// useful for fields request rules validation
$this->applyWhen($request->user()->isAdmin(), [
'first-secret' => 123,
'second-secret' => 456.789,
]),
];
}
protected function toAttributes(Request $request): array
{
return [
'name' => $this->string(),
// pass key to describer
$this->string('email'),
// with lazy evaluation
'hash64' => $this->string(fn() => base64_encode("{$this->id}-{$this->email}")),
// Conditional attribute
$this->string('secret')->when($request->user()->isAdmin(), 'secret-value'),
// Merging Conditional Attributes
$this->applyWhen($request->user()->isAdmin(), [
'first-secret' => $this->integer(fn() => 123),
'second-secret' => $this->float(fn() => 456.789),
]),
];
}
protected function toRelationships(Request $request): array
{
return [
'avatar' => AvatarResource::relationship($this->avatar),
// with conditional relationship
'administrator' => $this->when($request->user()->isAdmin(), UserResource::relationship(fn() => $this->administrator),
// as collection, with conditional value
'comments' => CommentResource::relationship(fn() => $this->whenLoaded('comments'))->asCollection(),
// with relationship (allow to
protected function toRelationships(Request $request): array
{
return [
'avatar' => AvatarResource::relationship($this->avatar),
// as collection, with condition
'comments' => CommentResource::relationship(fn() => $this->whenLoaded('comments'))->asCollection(),
// with relationship (allow to
protected function toRelationships(Request $request): array
{
return [
'avatar' => $this->one(AvatarResource::class),
// custom relation name
'my-avatar' => $this->one(AvatarResource::class, 'avatar'),
// as collection, with condition
'comments' => $this->many(CommentResource::class)
->whenLoaded(),
// with relationship (allow to sts()->count()),
]),
];
}
protected function toRelationships(Request $request): array
{
return [
'posts' => PostResource::relationship(fn() => $this->posts)->withLinks(fn() => [
// links
'self' => "https://api.example.com/user/{$this->id}/relationships/posts",
'related' => "https://api.example.com/user/{$this->id}/posts",
])->withMeta(fn() => [
// meta
'creator' => $this->name,
])
->asCollection(),
];
}
protected function toLinks(Request $request): ?array
{
return [
'self' => route('api.user.show', ['id' => $this->id]),
];
}
protected function toResourceMeta(Request $request): ?iterable
{
return [
'created_at' => $this->created_at->format(DateTimeInterface::ATOM),
'updated_at' => $this->updated_at->format(DateTimeInterface::ATOM),
];
}
protected function toMeta(Request $request): ?iterable
{
return [
"copyright": "Copyright 2022 My Awesome Api",
];
}
UserResource::collection(User::all()); // => JsonApiCollection
/// Role.php
enum Role {
case ADMIN;
case USER;
}
/// State.php
enum State:int {
case ACTIVE = 1;
case INACTIVE = 0;
}
/// User.php
class User extends Model
{
$casts = [
'role' => Role::class,
'state' => State::class,
];
}
// UserResource.php
protected function toAttributes(Request $request): array
{
return [
'status' => $this->enum(),
'role' => $this->enum(),
];
}
[
"status": 1,
"role": "ADMIN"
]