Khi người dùng gửi form đăng ký, đăng nhập, tìm kiếm hoặc gọi một API, dữ liệu từ phía client cần được ứng dụng Laravel tiếp nhận trước khi xử lý. Laravel cung cấp Request để đại diện cho HTTP request hiện tại và giúp lấy các dữ liệu mà người dùng gửi lên như form data, query parameters, route parameters, JSON, header hoặc file. Hiểu cách sử dụng Request là bước cơ bản để xử lý dữ liệu đầu vào trong hầu hết ứng dụng Laravel.
Laravel Request là gì?
Laravel Request là đối tượng đại diện cho một HTTP request được gửi tới ứng dụng Laravel.
Request có thể chứa nhiều loại thông tin:
- Dữ liệu từ form.
- Query parameters trên URL.
- Tham số của route.
- Dữ liệu JSON từ API.
- HTTP headers.
- Cookie.
- File được upload.
- HTTP method và thông tin URL.
Ví dụ một form gửi:
POST /users
name=Nguyen Van A
email=a@example.com
Trong Controller, Laravel có thể nhận Request:
use Illuminate\Http\Request;
public function store(Request $request)
{
$name = $request->input('name');
$email = $request->input('email');
}
Ở đây $request chứa thông tin của request mà người dùng vừa gửi đến server.

Lấy dữ liệu form với Request
Cách phổ biến nhất là sử dụng input():
$name = $request->input('name');
$email = $request->input('email');
Có thể truyền giá trị mặc định nếu dữ liệu không tồn tại:
$name = $request->input('name', 'Guest');
Ngoài ra, Laravel hỗ trợ lấy toàn bộ input:
$data = $request->all();
Tuy nhiên, không nên lấy toàn bộ dữ liệu một cách máy móc nếu chỉ cần một vài trường.
Có thể lấy những trường cần thiết bằng only():
$data = $request->only([
'name',
'email',
]);
Hoặc loại bỏ một số trường bằng except():
$data = $request->except([
'password',
]);
Trong các chức năng xử lý dữ liệu, only() thường dễ kiểm soát hơn việc nhận toàn bộ input từ client.
Nếu đang xây dựng kiến thức nền về cách Laravel tiếp nhận và xử lý dữ liệu, Laravel cơ bản là phần nên nắm trước khi đi sâu vào Request và Validation.
Kiểm tra dữ liệu có tồn tại hay không
Laravel Request cung cấp một số phương thức giúp kiểm tra input.
has()
Kiểm tra key có tồn tại trong request:
if ($request->has('email')) {
// Có key email
}
filled()
Kiểm tra giá trị có tồn tại và không rỗng:
if ($request->filled('email')) {
// Email có giá trị
}
missing()
Kiểm tra key không tồn tại:
if ($request->missing('phone')) {
// Không có phone
}
Những phương thức này hữu ích khi một số trường trong form là tùy chọn hoặc request có thể thay đổi theo từng trường hợp.
Lấy Query Parameter
Request không chỉ nhận dữ liệu từ form. Laravel còn có thể lấy các tham số xuất hiện trên URL.
Ví dụ:
/products?category=phone&page=2
Có thể lấy bằng:
$category = $request->query('category');
$page = $request->query('page');
Hoặc:
$category = $request->input('category');
Nếu cần lấy toàn bộ query parameters:
$query = $request->query();
Ví dụ:
public function index(Request $request)
{
$keyword = $request->query('keyword');
// Xử lý tìm kiếm
}
Cách này thường được sử dụng cho các chức năng tìm kiếm, lọc dữ liệu và phân trang.
Lấy Route Parameter
Route cũng có thể chứa tham số:
Route::get('/users/{id}', [UserController::class, 'show']);
Khi người dùng truy cập:
/users/15
Có thể lấy id từ Request:
$id = $request->route('id');
Tuy nhiên, với những route làm việc trực tiếp với Model, Laravel còn hỗ trợ Route Model Binding:
Route::get('/users/{user}', [UserController::class, 'show']);
Controller:
public function show(User $user)
{
return $user;
}
Cách này giúp Laravel tự tìm Model tương ứng với tham số route và giảm phần code xử lý thủ công.
Xử lý JSON Request
Request đặc biệt quan trọng khi xây dựng API.
Client có thể gửi:
{
"name": "Nguyen Van A",
"email": "a@example.com"
}
Laravel có thể lấy dữ liệu:
$name = $request->input('name');
$email = $request->input('email');
Hoặc lấy trực tiếp JSON:
$data = $request->json()->all();
Trong thực tế, input() thường đủ cho các trường hợp lấy dữ liệu từ JSON request.
Ví dụ:
public function store(Request $request)
{
$name = $request->input('name');
$email = $request->input('email');
// Xử lý dữ liệu
}
Sau khi nhận dữ liệu, API thường cần thực hiện Validation trước khi lưu hoặc xử lý tiếp.
Kiểm tra HTTP Method
Request cũng cho phép kiểm tra phương thức HTTP:
if ($request->isMethod('post')) {
// Xử lý POST
}
Có thể kiểm tra các phương thức phổ biến:
$request->isMethod('get');
$request->isMethod('post');
$request->isMethod('put');
$request->isMethod('patch');
$request->isMethod('delete');
Trong nhiều trường hợp, Route đã xác định HTTP method nên Controller không cần kiểm tra lại. Tuy nhiên, khả năng này vẫn hữu ích khi xử lý những luồng request đặc biệt.
Lấy Header từ Request
HTTP Request có thể chứa các header như:
Authorization
Accept
Content-Type
User-Agent
Laravel cho phép lấy header:
$token = $request->header('Authorization');
Hoặc kiểm tra header:
if ($request->hasHeader('Authorization')) {
// Có Authorization header
}
Trong API, header thường được sử dụng để truyền thông tin xác thực hoặc mô tả định dạng dữ liệu. Tuy nhiên, việc tự đọc token từ header không đồng nghĩa với việc ứng dụng đã xác thực người dùng. Phần Authentication nên được xử lý bằng cơ chế phù hợp của Laravel.
Xử lý file upload
Request cũng có thể nhận file từ form:
<input type="file" name="avatar">
Trong Controller:
$file = $request->file('avatar');
Có thể kiểm tra file:
if ($request->hasFile('avatar')) {
$file = $request->file('avatar');
}
Sau đó xử lý upload:
$path = $request->file('avatar')->store('avatars');
Tuy nhiên, file upload cần được Validation trước khi lưu để kiểm soát loại file, kích thước và các điều kiện cần thiết.
Laravel Request kết hợp với Validation
Request chỉ có nhiệm vụ tiếp nhận và cung cấp dữ liệu. Việc dữ liệu có hợp lệ hay không là trách nhiệm của Validation.
Ví dụ:
public function store(Request $request)
{
$validated = $request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'email'],
]);
// $validated chứa dữ liệu đã vượt qua validation
}
Sau khi Validation thành công, có thể sử dụng $validated để tiếp tục xử lý.
Cách này tốt hơn việc lấy toàn bộ $request->all() rồi đưa trực tiếp vào database.
Với các form có nhiều rule hoặc cần tái sử dụng validation, Laravel còn cung cấp Form Request để tách phần validation ra khỏi Controller.
Request không nên chứa toàn bộ logic nghiệp vụ
Một lỗi thường gặp là đưa quá nhiều xử lý vào Controller chỉ vì dữ liệu đến từ Request.
Ví dụ không nên biến Controller thành nơi:
Nhận Request
↓
Validate
↓
Tính toán phức tạp
↓
Gửi email
↓
Gọi API
↓
Cập nhật nhiều bảng
↓
Trả Response
Request chỉ nên đóng vai trò cung cấp dữ liệu đầu vào.
Một luồng hợp lý hơn là:
Request
↓
Validation
↓
Controller
↓
Service / Model / Job
↓
Database hoặc hệ thống khác
↓
Response
Cách tổ chức này giúp mỗi thành phần đảm nhiệm đúng trách nhiệm và dễ bảo trì hơn khi ứng dụng phát triển.

Một số phương thức Request thường dùng
| Phương thức | Công dụng |
|---|---|
input() |
Lấy một giá trị đầu vào |
all() |
Lấy toàn bộ input |
only() |
Chỉ lấy các trường cần thiết |
except() |
Loại bỏ một số trường |
has() |
Kiểm tra key tồn tại |
filled() |
Kiểm tra giá trị không rỗng |
query() |
Lấy query parameter |
route() |
Lấy route parameter |
header() |
Lấy HTTP header |
file() |
Lấy file upload |
hasFile() |
Kiểm tra file tồn tại |
isMethod() |
Kiểm tra HTTP method |
Không cần ghi nhớ tất cả ngay từ đầu. Quan trọng nhất là hiểu dữ liệu đang đến từ đâu và chọn phương thức phù hợp để lấy dữ liệu đó.
Kết luận
Laravel Request là thành phần trung gian giúp ứng dụng tiếp nhận dữ liệu từ HTTP request. Từ form, query string, route, JSON cho đến header và file upload, Laravel đều cung cấp các phương thức rõ ràng để đọc và xử lý dữ liệu. Trong một luồng xử lý thông thường, Request nên tập trung vào việc nhận dữ liệu, Validation chịu trách nhiệm kiểm tra dữ liệu, còn Controller và các lớp nghiệp vụ đảm nhiệm xử lý logic.
Khi đã hiểu cách Request hoạt động, việc xây dựng form, CRUD và REST API trong Laravel sẽ trở nên dễ dàng hơn. Bạn có thể tiếp tục truy cập Học Laravel để tìm hiểu sâu hơn về Validation, Form Request, Controller, API và các thành phần liên quan.

