Install via Composer:
composer require laravel-json-api/laravel
Publish the package config (if needed):
php artisan vendor:publish --provider="LaravelJsonApi\LaravelJsonApiServiceProvider"
Register the service provider in config/app.php (if not auto-discovered).
First use case: Fetch a JSON:API-compliant response for a model:
use LaravelJsonApi\Laravel\JsonApiResource;
use App\Models\User;
class UserResource extends JsonApiResource
{
public static $resourceKey = 'users';
public static $primaryKey = 'id';
}
Route::get('/users', function () {
return UserResource::collection(User::all());
});
JsonApiResource for each model.$relationships property or hasMany, belongsTo methods.fields() or resolveField() for dynamic attributes.Resource::paginate()).JsonApiQueryBuilder for query filtering:
UserResource::collection(User::query()->filter());
JsonApiQueryBuilder for sorting:
UserResource::collection(User::query()->sort());
?include=posts,comments:
UserResource::collection(User::all())->withIncludes();
JsonApiResource.JsonApiResource responses in PHPUnit:
$this->getJson('/users')->assertJsonStructure([
'data' => [
['type' => 'users', 'id' => '1']
]
]);
laravel/framework constraint in composer.json:
"laravel/framework": "^10.0"
getWheres() in custom queries, ensure you’re using the updated method signature (now type-hinted).$resourceKey and $primaryKey are set in your JsonApiResource.JsonApiQueryBuilder::debug() to inspect parsed query parameters:
User::query()->filter()->debug();
resolveQuery() in your resource:
public static function resolveQuery($query)
{
return $query->where('active', true);
}
return UserResource::collection(User::all())->withMeta(['custom' => 'value']);
JsonApiException for malformed requests.with() for relationships to avoid N+1 queries:
UserResource::collection(User::with('posts')->get());
JsonApiResource::cache() (requires laravel-json-api/cache package).How can I help you explore Laravel packages today?