1. Laravel Routing & Controllers là gì?

Khi xây dựng backend bằng Laravel, client gửi HTTP request đến server để thực hiện một thao tác như lấy danh sách user, xem chi tiết sản phẩm hoặc tạo đơn hàng.

Laravel cần xác định request đó sẽ được xử lý ở đâu và logic xử lý nằm trong thành phần nào. Đây là nhiệm vụ của Routing và Controller.

Routing xác định request dựa trên HTTP method, URL và các điều kiện liên quan, sau đó chuyển request đến nơi xử lý phù hợp.

Controller tiếp nhận và điều phối quá trình xử lý request, chẳng hạn lấy dữ liệu, gọi service hoặc trả response.

Ví dụ client gọi:

GET /api/users/10

Laravel có thể định tuyến request đến UserController, gọi method show() và trả thông tin user có ID là 10.

Client
  │
  │ GET /api/users/10
  ▼
Route
  │
  ▼
Middleware (nếu có)
  │
  ▼
UserController@show
  │
  ▼
Lấy dữ liệu User
  │
  ▼
HTTP Response

Có thể hiểu đơn giản: Route quyết định request đi đâu, Controller quyết định request được xử lý như thế nào.

2. Routing trong Laravel

Route nằm ở đâu?

Laravel lưu các định nghĩa route trong thư mục:

routes/
├── web.php
└── api.php

web.php thường chứa route cho website, giao diện web và các chức năng sử dụng session.

api.php thường chứa route cho REST API. Những route này được cấu hình theo nhóm middleware API và mặc định có prefix /api trong cấu hình chuẩn.

Route Closure và Controller khác nhau thế nào?

Với route đơn giản, Laravel cho phép xử lý trực tiếp bằng closure:

Route::get('/hello', function () {
    return 'Hello Laravel';
});

Cách này phù hợp với những xử lý rất nhỏ hoặc route phục vụ mục đích đơn giản.

Nhưng nếu route bắt đầu chứa nhiều logic như lấy dữ liệu, kiểm tra quyền, xử lý nghiệp vụ và trả response, việc đặt tất cả code trong file route sẽ khiến ứng dụng khó quản lý.

Khi đó, nên chuyển phần xử lý sang Controller:

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);

Laravel sẽ gọi method index() của UserController khi request khớp với route này.

Nguyên tắc: Route nên tập trung vào việc khai báo endpoint và cách định tuyến; logic xử lý request nên được đặt trong Controller hoặc các thành phần chuyên trách phù hợp.

Route Parameter và Query Parameter

Hai loại tham số này rất dễ nhầm lẫn.

Route parameter nằm trong đường dẫn:

GET /users/10

Ở đây 10 là ID của user cần xem.

Query parameter nằm sau dấu ?:

GET /users?page=2&limit=10

Ở đây page và limit có thể được sử dụng để phân trang danh sách user.

Thông thường, route parameters xác định resource hoặc phần của đường dẫn; query parameters biểu diễn các tùy chọn như tìm kiếm, lọc, sắp xếp và phân trang.

3. Named Routes – Đặt tên cho Route

Một route có thể được gán tên:

Route::get('/users/{id}', [UserController::class, 'show'])
    ->name('users.show');

Sau đó, thay vì tự ghép URL ở nhiều nơi, có thể tạo URL bằng tên route:

$url = route('users.show', ['id' => 10]);

Laravel tạo URL tương ứng với route users.show.

Named route hữu ích khi:

  • Tạo URL trong Blade hoặc trong code.
  • Redirect đến một route khác.
  • Tránh hard-code đường dẫn ở nhiều nơi.
  • Giảm công sức khi URL thay đổi nhưng tên route vẫn được giữ nguyên.

Tên route cần duy nhất trong application để tránh nhầm lẫn khi tạo URL.

4. Route Groups – Nhóm các Route liên quan

Trong application thực tế, nhiều route thường dùng chung prefix, middleware hoặc quy tắc đặt tên.

Thay vì khai báo lặp lại, Laravel cho phép sử dụng route group.

Ví dụ:

Route::prefix('admin')
    ->name('admin.')
    ->middleware('auth')
    ->group(function () {
        Route::get('/dashboard', [AdminController::class, 'dashboard'])
            ->name('dashboard');

        Route::get('/users', [AdminUserController::class, 'index'])
            ->name('users.index');
    });

Những route trên có các đặc điểm chung:

Prefix: admin
Middleware: auth
Name prefix: admin.

Do đó, URL và tên route tương ứng là:

/admin/dashboard
admin.dashboard

/admin/users
admin.users.index

Route group giúp tổ chức các endpoint theo khu vực chức năng hoặc quyền truy cập.

5. Controller trong Laravel

Controller có nhiệm vụ gì?

Controller là class chịu trách nhiệm tiếp nhận và điều phối request đến phần xử lý phù hợp.

Một Controller có thể có nhiều method, mỗi method xử lý một thao tác liên quan đến chức năng của nó.

Ví dụ UserController có thể xử lý:

index()   → Lấy danh sách user
show()    → Xem một user
store()   → Tạo user
update()  → Cập nhật user
destroy() → Xóa user

6. Route Model Binding – Laravel tự tìm Model từ URL

Controller nhận ID rồi tự truy vấn database:

public function show(string $id)
{
    $user = User::findOrFail($id);

    return response()->json($user);
}

Laravel có cơ chế Route Model Binding, cho phép truyền trực tiếp một Model vào method dựa trên tham số của route.

Khai báo route:

Route::get('/users/{user}', [UserController::class, 'show']);

Controller:

use App\Models\User;

public function show(User $user)
{
    return response()->json($user);
}

Khi client gọi:

GET /api/users/10

Laravel tự tìm User tương ứng với ID 10 và truyền Model vào method show().

Nếu không tìm thấy Model phù hợp, Laravel thường trả 404 Not Found.

7. Dependency Injection trong Controller

Controller thường cần sử dụng các dependency, ví dụ Request, Service hoặc một lớp xử lý nghiệp vụ.

Laravel hỗ trợ Dependency Injection, giúp truyền dependency vào nơi cần sử dụng thay vì phải tự khởi tạo thủ công trong mọi method.

Ví dụ nhận Request:

use Illuminate\Http\Request;

public function store(Request $request)
{
    $name = $request->input('name');

    // Xử lý request
}

Laravel tự cung cấp đối tượng request phù hợp cho method.

Với một service:

class ProductController extends Controller
{
    public function __construct(
        private ProductService $productService
    ) {
    }

    public function index()
    {
        return response()->json(
            $this->productService->getProducts()
        );
    }
}

Laravel Service Container có thể tự resolve ProductService nếu dependency được cấu hình phù hợp.

Lợi ích là Controller có thể sử dụng logic ở class khác mà không cần tự quản lý toàn bộ việc tạo dependency.

Đối với những API đơn giản, không cần tạo Service chỉ để chuyển tiếp một lời gọi. Khi nghiệp vụ trở nên phức tạp hoặc cần tái sử dụng, việc tách logic ra Service sẽ hữu ích hơn.

8. Tổng kết

Laravel Routing & Controllers là nền tảng để hiểu request được tiếp nhận và điều phối trong một application Laravel như thế nào.

Routing quyết định request nào sẽ đi đến handler nào, dựa trên HTTP method và URI. Route parameters truyền thông tin qua URL; named routes hỗ trợ tạo URL ổn định; route groups giúp tổ chức những endpoint có chung prefix, middleware hoặc tên.

Controller tập hợp các method xử lý request theo nhóm chức năng. Với API CRUD, Resource Controller giúp chuẩn hóa các thao tác như index, show, store, update và destroy. Route Model Binding giảm code truy vấn lặp lại, còn Dependency Injection giúp Controller sử dụng Request và các service cần thiết.

Bài viết khác

Go Channels & Go Context

1. Go Channels & Go Context là gì? Trong Go, goroutine cho phép chương trình chạy nhiều công việc đồng thời. Tuy nhiên, khi có nhiều goroutine cùng hoạt động, chúng cần một cách để trao đổi kết quả, phối hợp thời điểm thực thi và dừng công việc khi không còn cần thiết.  Đây […]

Goroutine & Concurrency

1. Concurrency là gì? Concurrency là khả năng tổ chức nhiều công việc để chúng có thể tiến triển xen kẽ hoặc đồng thời trong cùng một khoảng thời gian. Thay vì phải thực hiện tất cả công việc theo một trình tự duy nhất, chương trình có thể chuyển đổi giữa nhiều công việc […]

Go Fundamentals

1. Go là gì? Go (Golang) là ngôn ngữ lập trình go thường được sử dụng trong backend, REST API, hệ thống mạng, công cụ dòng lệnh, cloud infrastructure và các dịch vụ chạy đồng thời. Go là ngôn ngữ biên dịch và có hệ thống kiểu dữ liệu tĩnh (statically typed). Điều này có […]

Series 2 — Frontend Fundamentals: Responsive Web Design – Bootstrap

Series 2 — Frontend Fundamentals   HTML → Sematic HTML → Forms & Validation → CSS  Flexbox & Grid → Responsive Web Design → Bootstrap   Bài 6. Responsive Web Design – Giao diện đa thiết bị 1. Responsive Web Design là gì? Khi xây dựng một website, chúng ta không thể giả định rằng […]

HTTP & HTTPS

Giao thức HTTP và HTTPS là gì? 1. HTTP là gì? HTTP (Hypertext Transfer Protocol) là giao thức truyền tải siêu văn bản, được sử dụng để trao đổi dữ liệu giữa client (máy khách) và server (máy chủ). Ban đầu, HTTP được phát triển để trao đổi các tài liệu trên Web. Ngày nay, […]

Series 2 — Frontend Fundamentals: CSS — Flexbox-Grid

Series 2 — Frontend Fundamentals   HTML → Sematic HTML → Forms & Validation → CSS  Flexbox & Grid → Responsive Web Design → Bootstrap   Bài 4. CSS Fundamentals – CSS là gì?   CSS Fundamentals – CSS là gì và hoạt động như thế nào? Ở những bài trước, chúng ta đã tìm […]

Leave a Reply

Your email address will not be published. Required fields are marked *