Home Laravel Laravel – Vì sao nên dùng Resource Controllers

Laravel – Vì sao nên dùng Resource Controllers

Sử dụng Resource Controllers, Resource Routes trong Laravel

by Agnes

Resource controller rất hay được  áp dụng trong code khi làm những dự án sử dụng Laravel framework. Hay khi tạo một ứng dụng CRUD thì đa phần mọi người cũng hay áp dụng nó.

Vậy Resource controller là gì? Tại sao Laravel lại có nó và ai cũng khuyên rằng nên sử dụng nó. BÀi viết này sẽ giải đáp những thắc mắc trên và hiểu được mục đích tại sao phải sử dụng Resource trong Laravel.

Resource Controllers trong Laravel là gì? 

Ta có thể hiểu Resource Controller trong Laravel như là một loại controller mà trong đó nó đã cung cấp sẵn cho chúng ta các action bao gồm index, create, store, show, edit, update, destroy để thực hiện các hành động của mô hình CRUD.

Vậy những action trong Resource controller đó có công dụng gì? Làm sao để tạo được chúng? Chúng được sử dụng như thế nào? Mục đích, lý do vì sao mà ta cần sử dụng Resource controller?

Để giải đáp những câu hỏi này và hiểu rõ được Resource thì chúng ta sẽ đi vào từng phần sau nhé!

Cách tạo một Resource controller

Trước tiên chúng ta cần phải biết cách tạo Resource controller như thế nào. Laravel đã làm sẵn cho chúng ta một lệnh để nhanh chóng render ra Resource Controller và chứa đầy đủ các action trong controller đó.

Tất nhiên không phủ định rằng trên thực tế chúng ta vẫn có thể tự tạo ra các action tuân thủ theo quy định của Resource. Nhưng chúng ta không nhất thiết phải tốn thời gian làm việc đó trong khi chỉ cần chạy lệnh sau để khởi tạo:

php artisan make:controller NameController --resource

Đây là tổng hợp các action trong file Controller sau khi chạy lệnh trên:

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ItemController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }
    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }
    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }
    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }
    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }
    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }
    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

Để dễ hình dung mục đích và lý do vì sao cần dùng Resource trong laravel thì trước hết mình sẽ sơ lược qua về cách khai báo và nội dung của Resource để các bạn nắm trước nhé!

Các cách khai báo Resource route cho controller

Hiện tại ta có 2 dạng khai báo Resource route cho controller. Cả 2 đều không chênh lệnh ảnh hưởng quá nhiều về tốc độ gì cả. Bạn có thể sử dụng cách nào cũng được:

 1. Khai báo từng resource trên từng dòng riêng biệt.

khai bao resource tren tung dong

Cách 1: khai báo từng resource trên từng dòng riêng biệt

2: Khai báo resource route dạng mảng chứa các phần tử là các controller cần dùng.

khai bao resource dang mang gom phan tu la cac controller

Cách 2: Khai báo resource dạng mảng

Nội dung của các action được xử lý bởi resource controllers

Method

URI

Action

Tên route

GET

/action

index

action.index

GET

/action/create

create

action.create

POST

/action

store

action.store

GET

/action/{action}

show

action.show

GET

/action/{action}/edit

edit

action.edit

PUT/PATCH

/action/{action}

update

action.update

DELETE

/action/{action}

destroy

action.destroy

Đối với mỗi action trong file controller thì mặc định laravel đều đã giải thích sẵn ở phần comment code của mỗi hàm. Mình chỉ sẽ sơ lược lại ý nghĩa và nội dung của chúng:

  • index: hiển thị giao diện chứa list của Object mà ta đang làm
  • create : hiển thị create form layout
  • store: sẽ nhận request( tham số truyền vào) khi submit từ màn hình create→ tạo mới dữ liệu
  • edit : hiển thị edit form layout
  • update: sẽ nhận request khi submit từ màn edit → update dữ liệu lên database
  • show: hiển thị thông tin chi tiết của Object thông qua id truyền vào

Sau khi có thể khai báo dựa trên khái niệm trên thì chúng ta sẽ đi sâu vào những lý do vì sao lại cần sử dụng Resource controllers.

Vì sao lại sử dụng Resource trong Laravel?

Chúng ta có 3 lợi ích dễ nhận thấy nhất khi áp dụng Resource vào project như sau:

  1. Dùng resource routes để giảm thiểu số dòng code trong web.php => Tối ưu hóa code
  2. Chuẩn hóa code
  3. Tiết kiệm thời gian, tăng hiệu quả làm việc nhóm

Lý do vì sao mình lại nêu ra 3 lợi ích trên thì chúng ta sẽ đi vào từng  phần để hiểu rõ hơn về nó nhé!

Tối ưu code, giảm thiểu số dòng code trong web.php

Trong một sự án nói riêng hay tất cả các dự án được xây dựng bởi laravel framework nói chung thì việc thực hiện các tính năng manage thêm xóa sửa cho một Object (VD: User, Order,…) là điều tất yếu.

Cho nên đối với mỗi tính năng đó sẽ có từng action riêng để đáp đứng đúng yêu cầu của tính năng đặt ra.

Như vậy vấn đề đặt ra ở đây là đối với từng action đó, bạn sẽ cần phải đăng ký một route riêng bằng cách viết thêm một dòng route::method() trong file web.php

Khi này nếu dự án ngày càng phát triển và bạn ngày càng tạo nhiều route trong web.php sẽ gây rối, khó đọc, tốn thời gian tìm kiếm và sẽ rất dễ nhầm lẫn các route với nhau.

Chính vì lẽ đó mà Resource routes được sinh ra để tối ưu hóa code và giải quyết vấn đề này.

Ta sẽ nhìn vào ví dụ phía dưới để hiểu rõ hơn:

Route::get('/', [ItemController::class, 'index'])->name('admin.dashboard');
Route::get('item/{id}', [ItemController::class, 'show'])->name('admin.item.show');
Route::get('item/{create', [ItemController::class, 'create'])->name('admin.item.create');
Route::post('store', [ItemController::class, 'store'])->name('admin.item.store');
Route::get('item/{id}/edit', [ItemController::class, 'edit'])->name('admin.item.edit');
Route::post('item/update/{id}', [ItemController::class, 'update'])->name('item.update');
Route::delete('item/{id}', [ItemController::class, 'destroy'])->name('admin.item.destroy');

Bên trên là danh sách các route dùng để quản lý item. Chúng bao gồm những action trên và với cách gọi của action sẽ được đặt theo ý của bạn. Thay vào đó bây giờ ta chỉ cần sử dụng resource routes và gọi một dòng duy nhất:

using resource route on web

Using resource routes on web.php

Chuẩn hóa code và tăng hiệu quả làm việc nhóm

Trong phần này chúng ta sẽ đi qua về phần ví dụ trước tiên và mình sẽ giải thích chi tiết để các bạn dễ hình dung mục đích của Resource. Hãy nhìn vào tấm hình bên dưới:

Ví dụ

vi du ve khong dong bo code laravel

Ví dụ về vấn đề không đồng bộ code

Giả định trong một team có 2 member cùng làm chung một task test về manage user (bao gồm view, add, update, delete User).

Ta thấy rằng cùng làm một tính năng nhưng họ lại định nghĩa các method khác nhau và sau đó họ lại đặt tên các file view khác nhau hay có thể quá hơn nữa là class của họ cũng khác luôn.

Vậy tại sao lại có ví dụ này? Chúng ta thấy rằng khi các member đặt file, đặt class hoặc hàm thì nó không hề theo một quy định nào cả. Đặc biệt là đối với những bạn mới học, mới biết đến PHP, các bạn hiểu như thế là đúng→ tự đặt ra tên method theo ý, theo cách mà bạn hiểu.

Kết luận

Mặc dù nó không sai, code vẫn chạy đúng. Nhưng nó không theo quy chuẩn nào cả. Điều đó sẽ gây khó tiếp cận cho đồng nghiệp hoặc những bạn join vào dự án sau này. Khi đó ông B sẽ tự đặt câu hỏi không biết phương thức ông A dùng là gì, phải vào code dò xem method ổng đặt là gì → lại phải xác định xem logic xử lý như thế nào → sẽ mất nhiều thời gian.

Vì vậy mà Resource ra đời để tạo ra một Chuẩn Chung cho team. Thành viên trong team có thể chưa cần phải vào code đọc thì cũng đã mườn tượng ra được cái tính năng này đang dùng những method nào. Từ đó sẽ giúp ta làm việc hiệu quả hơn, dỡ mất thời gian, quan trọng nhất là tạo ra được chuẩn chung cho team khi phát triển project.

Ví dụ trực quan: 2 anh em cùng đi từ nhà đến trường nhưng lại theo 2 con đường, 2 cây cầu với độ dài khác nhau sẽ xảy ra hiện tượng người đến trước người đến sau (Không đồng bộ). Thay vào đó ta xây 1 đường nhựa ngắn nhất đi thẳng từ nhà đến trường và cho 2 người đi chung sẽ đảm bảo được tính đồng nhất, tiết kiệm thời gian.

Partial Resource Routes

Laravel tạo sẵn cho chúng ta 2 hàm để nâng cao khả năng tùy biến trong resource routes đó là only(), except().

Hai hàm trên sẽ giúp ta lọc ra những action trong Route::resource() tùy theo nhu cầu của dự án. Từ đó có thể lọc và loại bỏ những method không cần dùng đến trong Controller.

Only()

Khi tạo resource routes mà ta chỉ cần sử dụng các action chứa trong mảng mà ta truyền vào thì khi này sẽ dùng hàm only()​.

Route::resource('item', ItemController::class)->only([
    'index', 'show'
]);

Except()

Đối nghịch với only() thì khi tạo resource routes mà ta muốn sử dụng tất cả action ngoại trừ các action đang chứa trong mảng. Lúc này ta sẽ dùng except()​.

Route::resource('item', ItemController::class)->except([
    'store', 'update', 'destroy'
]);

Để kiểm tra các route hiện đang được đăng ký trong project chúng ta có thể chạy lệnh command sau:

php artisan route:list

Tổng kết

Vậy mục đích sử dụng Resource trong laravel có những lợi ích sau:

  • Tối ưu hóa code
  • Chuẩn hóa code
  • Tăng hiệu quả, tiết kiệm thời gian làm việc

Resource hiện nay đang được sử dụng cực kỳ phổ biến dành cho những ứng dụng CRUD. Chính vì vậy chúng ta nên áp dụng những chuẩn code như vậy đối với tất cả project để giúp cho người khác nhanh chóng tiếp cận được những gì bạn đang làm.

Chúng ta hãy tự tạo cho mình một thói quen luôn hoàn thành tính năng nào đó mà trong code luôn cố gắng khai thác triệt để những action có sẵn của resource. Trừ khi tính năng càn xử lý nhiều và có nhiều action khác thì khi đó ta mới tạo thêm.

Tham khảo thêm tài liệu chi tiết từ Laravel: https://laravel.com/docs/9.x/controllers#resource-controllers

Xem thêm

5/5 - (1 vote)

Related Posts

4 3 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More

0
Would love your thoughts, please comment.x
()
x