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.







Khoá học lập trình game con rắn cho trẻ em




