Laravel jsonapi
Skill fusengine/agents/plugins/laravel-expert/skills/laravel-jsonapi
Use when building JSON:API compliant endpoints in Laravel 13 using the first-party `JsonApiResource` base class. Covers sparse fieldsets, inclusion, links, and response headers.From its SKILL.md
npx -y skills add fusengine/agents --skill laravel-jsonapiAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 22 stars22 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
4.5 KB, 986 tokens by cl100k_base, as published. Nobody here has run it
Laravel 13 JSON:API Resources
Agent Workflow (MANDATORY)
Before ANY implementation, use TeamCreate to spawn 3 agents:
- fuse-ai-pilot:explore-codebase - Inventory existing
JsonResourceclasses to migrate - fuse-ai-pilot:research-expert - Check JSON:API v1.1 spec for required headers and structure
- mcp__context7__query-docs - Pull
laravel.com/docs/13.x/eloquent-resourcesexamples
After implementation, run fuse-ai-pilot:sniper for validation.
Overview
| Feature | Description |
|---|---|
JsonApiResource | Base class extending JsonResource with spec compliance |
| Content-Type | Auto-sets application/vnd.api+json |
| Sparse fieldsets | ?fields[posts]=title,created_at |
| Inclusion | ?include=author,comments with included array |
| Resource identifiers | {"id":"1","type":"posts"} in relationships |
| Links | self, related links auto-generated |
Critical Rules
- Extend
JsonApiResource- Never roll your own JSON:API serializer; the base class handles spec edge cases - Declare
$type- Each resource MUST set a string$type(e.g.,posts,users) - Use
toAttributes()nottoArray()- JSON:API splits attributes from identifiers; mixing them breaks compliance - Whitelist relationships - Implement
relationships()returning only the relations clients may include - Respect Content-Type - Clients sending JSON:API requests MUST use
Accept: application/vnd.api+json
Architecture
app/Http/Resources/
├── PostResource.php # extends JsonApiResource, $type = 'posts'
├── UserResource.php # extends JsonApiResource, $type = 'users'
└── CommentResource.php # extends JsonApiResource, $type = 'comments'
app/Http/Controllers/
└── Api/PostController.php # returns PostResource::collection($posts)
→ See PostResource.php.md for full example
Reference Guide
| Topic | Reference | When to Consult |
|---|---|---|
| Base resource class | resources.md | Structuring JsonApiResource subclasses |
| Sparse fieldsets | sparse-fieldsets.md | Implementing fields[type]=a,b |
| Relationships | relationships.md | Inclusion + identifiers + links |
Templates
| Template | When to Use |
|---|---|
| PostResource.php.md | Resource with belongsTo + hasMany |
| UserResource.php.md | Simple resource with sparse fields |
Quick Reference
Minimal resource
use Illuminate\Http\Resources\Json\JsonApiResource;
class PostResource extends JsonApiResource
{
public string $type = 'posts';
public function toAttributes($request): array
{
return ['title' => $this->title, 'body' => $this->body];
}
}
Controller
return PostResource::collection(Post::with('author')->get());
→ See PostResource.php.md for complete example
Best Practices
DO
- Eager-load relationships used in
includeto avoid N+1 (?include=author→with('author')) - Document supported
includeandfieldsparameters in your OpenAPI spec - Set explicit
$typematching the URL segment (e.g.,/api/posts→'posts') - Use
toLinks()to exposeself,related, pagination links
DON'T
- Don't return a JSON:API response without the
JsonApiResourcebase class - manual JSON breaks subtle spec rules (e.g., null vs empty data) - Don't include relationships not whitelisted in
relationships()- silent ignoring keeps APIs predictable - Don't mix
toArray()andtoAttributes()- the JSON:API base class expects the latter - Don't forget to set the response Content-Type when bypassing resources (e.g., custom errors) - clients may reject the response
What ships with it: 5 files
9.0 KB alongside SKILL.md
references/
- relationships.md2.0 KB
- resources.md1.7 KB
- sparse-fieldsets.md1.6 KB
- templates/PostResource.php.md2.2 KB
- templates/UserResource.php.md1.6 KB