Basic and standard api response format for laravel using json resources.
composer require omalizadeh/laravel-api-response
Resources:
{
"data": {
"id": 1,
"email": "test@test.com"
},
"message": "message",
"errors": {
"password": [
"wrong password."
]
}
}
ResourceCollection:
{
"data": {
"items": [],
"count": 0,
"sum": null
},
"message": null,
"errors": null
}
On validation error for requests (with 422 status code):
{
"data": null,
"message": "first error message in message bag",
"error": {
"password": [
"password field is required."
]
}
}
Create resources and requests with artisan commands and pass data, message or count to resources like following examples:
public function index(EmailFilter $filters)
{
$emailsFilterResult = Email::filter($filters);
return EmailResource::collection([
'data' => $emailsFilterResult->data(),
'count' => $emailsFilterResult->count(),
]);
}
public function show(Email $email)
{
return new EmailResource(['data' => $email, 'message'=> 'email info.']);
}
You can specify output fields from transformDataItem() method of resource classes.
<?php
namespace App\Http\Resources;
use Omalizadeh\ApiResponse\Resources\BaseApiResource;
class EmailResource extends BasicResource
{
protected function transformDataItem($item)
{
return [
'id' => $item->id,
'email' => $item->email,
'status' => $item->status
];
}
}
Also, you can use apiResponse() helper function to directly send response
class PhoneController
{
public function show(Phone $phone)
{
return apiResponse()->data($phone)->message('phone info.')->status(200)->get();
}
public function index()
{
$phones = Phone::all();
return apiResponse()->collection($phones, $phones->count())->message('phone info.')->status(200)->get();
}
public function update(Request $request, Phone $phone)
{
$isUpdated = $phone->update($request->all());
if (!$isUpdated) {
return apiResponse()->errorMessage('phone is not updated');
}
return apiResponse()->data($phone)->message('phone is updated')->get();
}
}
In above example message and status are optional, and their default value respectively are null
and 200
.
php artisan make:api-resource ResourceClassName
php artisan make:api-request RequestClassName