Giới thiệu
- API (Application Programming Interface) là một giao diện mà một hệ thống máy tính hay ứng dụng cung cấp để cho các yêu cầu dịch vụ có thể được tạo ra từ các chương trình máy tính khác và cho phép dữ liệu có thể được trao đổi qua lại giữa chúng thông qua các phương thức
GET
,POST
,PUT
,DELETE
,PATCH
. - Khi khi dựng một API, bạn cần chuyển đổi dữ liệu Eloquent model và JSON được trả về bởi ứng dụng của người dùng. Lớp Laravel resource cho phép bạn chuyển đổi dễ dàng giửa model và model collection trong JSON.
Tạo Resource
- Để tạo một lớp resorce, bạn có thể sử dụng cửa sổ lệnh Artisan VD:
php artisan make:resource Product
. - Mặc định, resource sẽ được sinh ra trong thư mục
app/Http/Resource
trong project của bạn. Resource sử dụng lớpIlluminateHttpResourceJsonJsonResource
.
Resource Collections
- Ngoài việc tạo resource và chuyển đổi models, resource có thể chuyển đổi các collection của model. Điều này cho phép dữ liệu trả về bao gồm các liên kết liên quan đến collection của resource.
- Để tạo một resource collection, bạn nên sử dụng tham số
--collection
ở cuối câu lệnh tạo resource. Hoặc có thể thể thêm hậu tốCollection
sau tên resource, collection resource sử dụng lớpIlluminateHttpResourceJsonResourceCollection
.
1 2 3 | php artisan make:resource Products --collection php artisan make:resource ProductCollection |
Lớp JsonResource
- Một lớp resource đại diện cho một model cần được chuyển đổi trong một cấu trúc JSON.
- Tạo lớp resource 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<span class="token punctuation"></span>Http<span class="token punctuation"></span>Resources</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Http<span class="token punctuation"></span>Resources<span class="token punctuation"></span>Json<span class="token punctuation"></span>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> |
- Mỗi một lớp resource định nghĩa sẵn phương thức
toArray
trả về một mảng thuộc tính của đối tượng nên được chuyển đổi thành JSON khi gửi phản hổi response. - Chúng ta có thể truy cập thuộc tính của model thông biến
$this
.
1 2 3 4 5 6 7 | <span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Http<span class="token punctuation"></span>Resources<span class="token punctuation"></span>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<span class="token punctuation"></span>Models<span class="token punctuation"></span>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
- Nếu bạn muốn trả về một collection của resource hoặc một paginate, bạn có thể sử dụng phương thức collection khi tạo một thể hiện resource trong route hoặc controller.
1 2 3 4 5 6 7 | <span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Http<span class="token punctuation"></span>Resources<span class="token punctuation"></span>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<span class="token punctuation"></span>Models<span class="token punctuation"></span>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> |
- Chú ý VD trên không cho phép bổ sung dữ liệu nào khi được trả về với collection. Nếu muốn bổ sung resource, bạn cần tạo một 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<span class="token punctuation"></span>Http<span class="token punctuation"></span>Resources</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Http<span class="token punctuation"></span>Resources<span class="token punctuation"></span>Json<span class="token punctuation"></span>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> |
- Sau khi định nghĩa resource collection, nó có thể được gọi ở route hoặc controller.
1 2 3 4 5 6 7 | <span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Http<span class="token punctuation"></span>Resources<span class="token punctuation"></span>ProductCollection</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Models<span class="token punctuation"></span>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> |
- Khi trả về resource collection từ một route.
- Thuộc tính
$preserveKey
cho phép bạn biết các khóa collection có được giữ nguyên khôngpublic $preserveKeys = true;
- Thuộc tính
$collects
cho phép bạn thay đổi mapping mặc định của Collection
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<span class="token punctuation"></span>Http<span class="token punctuation"></span>Resources</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Http<span class="token punctuation"></span>Resources<span class="token punctuation"></span>Json<span class="token punctuation"></span>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> |