Introduce
- API (Application Programming Interface) is an interface that a computer system or application provides so that service requests can be made from other computer programs and allow data to be exchanged. Back and forth between them through methods
GET
,POST
,PUT
,DELETE
,PATCH
. - When building an API, you need to convert the Eloquent model and JSON data returned by the user’s application. The Laravel resource class allows you to easily convert between model and model collections in JSON.
Create Resource
- To create a resorce class, you can use the Artisan command window Example:
php artisan make:resource Product
. - By default, resources will be generated in the
app/Http/Resource
in your project. Resource usesIlluminateHttpResourceJsonJsonResource
.
Resource Collections
- In addition to creating resources and converting models, resources can transform collections of models. This allows the returned data to include links related to the collection of the resource.
- To create a resource collection, you should use the
--collection
parameter at the end of the resource creation statement. Or you can add theCollection
suffix after the resource name, the resource collection uses theIlluminateHttpResourceJsonResourceCollection
.
1 2 3 | php artisan make:resource Products --collection php artisan make:resource ProductCollection |
JsonResource class
- A resource class represents a model that needs to be transformed in a JSON structure.
- Create resource class Product
php artisan make:resource Product
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">App Http Resources</span> <span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate Http Resources Json JsonResource</span> <span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">Product</span> <span class="token keyword">extends</span> <span class="token class-name">JsonResource</span> <span class="token punctuation">{</span> <span class="token comment">/** * Transform the resource into an array. * * @param IlluminateHttpRequest $request * @return array */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">toArray</span> <span class="token punctuation">(</span> <span class="token variable">$request</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'id'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">id</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'name'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">name</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'slug'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">slug</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'price'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">price</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'quantity'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">quantity</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'created_at'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">created_at</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'updated_at'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">updated_at</span> <span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
- Each resource class has a predefined method
toArray
returns an array of properties of the object that should be converted into JSON when sending a response. - We can access the properties of the common model
$this
.
1 2 3 4 5 6 7 | <span class="token keyword">use</span> <span class="token package">App Http Resources Product</span> <span class="token keyword">as</span> ProductResource <span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">App Models Product</span> <span class="token punctuation">;</span> Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'/product'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">ProductResource</span> <span class="token punctuation">(</span> Product <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">find</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Resource Collections
- If you want to return a collection of a resource or a paginate, you can use the collection method when creating a resource instance in the route or controller.
1 2 3 4 5 6 7 | <span class="token keyword">use</span> <span class="token package">App Http Resources Product</span> <span class="token keyword">as</span> ProductResource <span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">App Models Product</span> <span class="token punctuation">;</span> Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'/products'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> ProductResource <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">collection</span> <span class="token punctuation">(</span> Product <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">all</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
- Note: The above example does not allow any additional data when being returned to the collection. If you want to add resources, you need to create a Collection
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">App Http Resources</span> <span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate Http Resources Json ResourceCollection</span> <span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">ProductCollection</span> <span class="token keyword">extends</span> <span class="token class-name">ResourceCollection</span> <span class="token punctuation">{</span> <span class="token comment">/** * Transform the resource collection into an array. * * @param IlluminateHttpRequest $request * @return array */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">toArray</span> <span class="token punctuation">(</span> <span class="token variable">$request</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'data'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">collection</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'links'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'self'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token single-quoted-string string">'link-value'</span> <span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
- After defining the resource collection, it can be called on the route or controller.
1 2 3 4 5 6 7 | <span class="token keyword">use</span> <span class="token package">App Http Resources ProductCollection</span> <span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">App Models Product</span> <span class="token punctuation">;</span> Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'/products'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">ProductCollection</span> <span class="token punctuation">(</span> User <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">all</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
- When returning a resource collection from a route.
- The
$preserveKey
attribute allows you to know if the collection keys are keptpublic $preserveKeys = true;
- The
$collects
property allows you to change the default Collection mapping
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">App Http Resources</span> <span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate Http Resources Json ResourceCollection</span> <span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">UserCollection</span> <span class="token keyword">extends</span> <span class="token class-name">ResourceCollection</span> <span class="token punctuation">{</span> <span class="token comment">/** * The resource that this resource collects. * * @var string */</span> <span class="token keyword">public</span> <span class="token variable">$collects</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'AppHttpResourcesMember'</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> </span> |