Github repository for more styled code
https://github.com/MohamedFathiM/Blogs/blob/main/apiResource.md
What is the API Resource :
A transformation layer that sits between your Eloquent models and the JSON responses.
First Time Using It:
The first time I am using the API resource, I was confused about the difference between the two classes, you will find it in the API resource of laravel (Resource, Collection), Ex: PostReource and PostCollection.
Larave Api Resource has two classes you can simply make them using artisan like that.
php artisan make:resource PostResource
This command create a class in App\Http\Resources extends JsonResource
php artisan make:resource PostCollection --collection
or
php artisan make:resource PostCollection
name of the class with suffix collection
this command create a class in App\Http\Resources extends ResourceCollection
so, what is the difference between them?
| Resource Class | Collection Class | 
|---|---|
| extends JsonResource | extends ResourceCollection | 
| mapping for a single model instance $post | mapping for collection of model $posts | 
| new PostResource(Post::find(1));              | new PostCollection(Post::paginate()) | 
| cannot paginate data, | can use paginate and return metadata.. | 
| doesn't support additional metadata | with the collection. | 
Tutorial :
Suppose you have a new laravel project and make Post model and posts_table migration
has fields title,description,user_id ..
Create PostResource and PostCollection :
 php artisan make:resource Posts/PostCollection
 php artisan make:resource Posts/PostResource
- edit PostResourcetoArrayto be like that :
public function toArray($request)
    {
        return [
            "title"       => $this->title,
            "description" => $this->description,
            "user"        => new UserResource($this->user)
        ];
    }
- create userResourceclassphp artisan make:resource Users/UserResource
- edit UserResourcetoArrayto be like that :public function toArray($request) { return [ "name" => $this->name, "email" => $this->email ]; }
- return to postsand editPostResourcetoArray:public function toArray($request) { return [ "status" => true, "msg" => "All Posts", "data" => $this->collection ]; }Now we are ready to return response posts collection :
- Add this method in routes/web.phpto quick testRoute::get("test", function () { return new PostCollection(Post::paginate()); });
- Now run the server into the project folder and open this link :php artisan serlocalhost:8000/test
Comments
Post a Comment