Laravel Request là gì? Cách xử lý dữ liệu người dùng gửi lên

Laravel Request là gì?

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.

Laravel Request là gì?
Laravel Request là gì?

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.

READ  Laravel Event là gì? Lắng nghe và phản hồi sự kiện ứng dụng

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.

READ  Hướng Dẫn Truy Vấn Bằng Laravel Query Builder

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ý.

READ  HTTP Response Là Gì? Cách Thiết Lập Thông Tin Trả Về Trong Laravel

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.

Request không nên chứa toàn bộ logic nghiệp vụ
Request không nên chứa toàn bộ logic nghiệp vụ

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.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *