Request trong Laravel 8 Chap 2- Tương tác

Bài trước chúng ta đã làm quen với khái niệm request của Laravel 8 rồi còn trong bài viết này chúng ta sẽ tìm hiểu về cách tương tác với dữ liệu trong request của Laravel 8 các bạn nhé!

Nhận dữ liệu input.

Để nhận tất cả dữ liệu input gửi lên request, chúng ta sử dụng phương thức all.

Ví Dụ:

$input = $request->all();

Trong trường hợp muốn lấy ra dữ liệu của một input cụ thể (bao gồm payload và query string) chúng ta có thể sử dụng phương thức input.

Ví Dụ:

$name = $request->input('name');

Mặc định, Laravel sẽ trả về null nếu input chúng ta cần lấy không tồn tại. chúng ta cũng có thể xác định giá trị mặc định cho input bằng cách truyền thêm tham số thứ 2 vào phương thức input.

Ví Dụ:

$name = $request->input('name', 'Phàm Nhân Tu Tiên');

Trong trường hợp dữ liệu chúng ta cần truy xuất là một mảng thì có thể sử dụng "." thay cho cách truy cập mảng.

Ví Dụ:

$name = $request->input('products.0.name');
// tương đương product[0]['name']

$names = $request->input('products.*.name');
// tương đương với lấy hết ra name của products

Nếu chúng ta không truyền tham số nào vào phương thức input thì Laravel sẽ trả về tất cả dữ liệu gửi lên request (tương tự như phương thức all).

Ví Dụ:

$input = $request->input();

// Tương đương với

$input = $request->all();

Trong một số trường hợp có sử dụng các thẻ HTML như checkbok, radio,... Và chỉ cần kiểm tra giá trị của nó là true hay false thôi, thì chúng ta có thể sử dụng phương thức boolean. Phương thức này sẽ nhận các giá trị 1, "1", true, "true", "on", và "yes" là true, còn ngược lại sẽ là false.

Ví Dụ:

$archived = $request->boolean('archived');

Laravel 8 cũng có apply magic method vào trong Request, nên chúng ta hoàn toàn có thể access đến một input dưới dạng property trong object. Đối với cách này thì Laravel 8 sẽ ưu tiên lấy ra giá trị trong payload trước.

Ví Dụ: Lấy ra dữ liệu của input name.

$name = $request->name;

Đôi lúc bạn cần lấy ra một số input nhất định nào đó nhưng không phải tất cả thì chúng ta có thể sử dụng phương thức only.

Ví Dụ: Chỉ lấy ra giá trị input username, password

$input = $request->only(['username', 'password']);

// hoặc

$input = $request->only('username', 'password');

Hoặc ngược lại muốn bỏ qua input nào đó còn lại sẽ lấy hết thì chúng ta có thể sử dụng phương thức except.

Ví Dụ: Bỏ qua input credit_card còn lại lấy hết.

$input = $request->except(['credit_card']);

// hoặc

$input = $request->except('credit_card');

Nhận dữ liệu query string.

Trong một số trường hợp chúng ta chỉ muốn lấy ra query string của dữ liệu gửi lên request. chúng ta có thể sử dụng phương thức query. Hàm này sẽ trả về một mảng data chứa các query string gửi lên request.

Ví Dụ:

$query = $request->query();

Nếu chúng ta cần lấy giá trị của một query tring cụ thể, chúng ta có thể truyền query string name vào phương thức query.

Ví Dụ:

$name = $request->query('name');

Mặc định, Laravel sẽ trả về null nếu query string chúng ta cần lấy không tồn tại. chúng ta cũng có thể xác định giá trị mặc định cho input bằng cách truyền thêm tham số thứ 2 vào phương thức query.

Ví Dụ:

$name = $request->query('name', 'Phàm Nhân Tu Tiên');

Kiểm tra dữ liệu input.

Để kiểm tra dữ liệu gửi lên có input nào đó hay không các chúng ta sử dụng phương thức has. Phương thức này sẽ trả về true nếu input xuất hiện trong request và ngược lại sẽ là false.

Ví Dụ:

if ($request->has('name')) {
    //
}

Chúng ta cũng có thể kiểm tra nhiều input với phương thức has bằng cách truyền vào một mảng các input. Lúc này phương thức sẽ trả về true nếu tất cả các input cần kiểm tra đều xuất hiện trong request, ngược lại nó sẽ trả về false.

Ví Dụ:

if ($request->has(['name', 'email'])) {
    //
}

Cách viết trên tương tự với:

if ($request->has('name') && $request->has('email')) {
    //
}

Nếu cần kiểm tra một mảng các input và sẽ trả về true nếu có một hoặc nhiều input xuất hiện trong danh sách đó. chúng ta có thể sử dụng phương thức hasAny.

Ví Dụ:

if ($request->hasAny(['name', 'email'])) {
    //
}

Cách viết trên tương tự với:

if ($request->has('name') || $request->has('email')) {
    //
}

Đôi lúc cần xử lí một số hành động, logic khi input có xuất hiện trong request chúng ta có thể sử dụng hàm whenHas.

Ví Dụ:

$request->whenHas('name', function ($input) {
    //
});

Lúc này nếu trong request có input name thì callback function sẽ được thực thi.

Đôi lúc chúng ta cần kiểm tra thêm input nào đó có xuất hiện trong input và phải có giá trị hay không? chúng ta có thể sử dụng phương thức filled. Phương thức này sẽ trả về true nếu input có xuất hiện trong input và có giá trị kèm theo.

Ví Dụ:

if ($request->filled('name')) {
    //
}

Tương tự, chúng ta cũng có thể dùng hàm whenFilled để thực thi logic khi input nào đó tồn tại và có giá trị.

Ví Dụ:

$request->whenFilled('name', function ($input) {
    //
});

Nếu chúng ta cần check xem một input nào đó không xuất hiện trong request, chúng ta có thể sử dụng phương thức missing. Phương thức này sẽ trả về true nếu input không xuất hiện trong request.

Ví Dụ:

if ($request->missing('name')) {
    //
}

Old input.

Mặc định, Laravel 8 sẽ lưu trữ lại giá trị các input của request để phục vụ request tiếp theo như recover lại dữ liệu khi validate sai,... Và quá trình này đã được làm tự động. Nhưng ở đây mình muốn giới thiệu với mọi người thêm một số phương thức để sử dụng trong trường hợp cần thiết.

  • flash: Phương thức này sẽ lưu hết dữ liệu input vào session. Và sẽ được xóa đi nếu chúng ta request lại lần tiếp theo.
  • flashOnly: Phương thức này sẽ lưu trữ các input được xác định vào session, còn lại sẽ bỏ qua.
  • flashExcept: Phương thức này sẽ bỏ qua các input được xác định vào session, còn lại sẽ lưu trữ.

Ví Dụ:

$request->flash();

$request->flashOnly(['username', 'email']);

$request->flashExcept('password');

Để lấy ra giá trị của input trước đó đã được store các chúng ta sử dụng phương thức old. Nếu dữ liệu không có giá trị phương thức sẽ trả về null.

Ví Dụ:

$username = $request->old('username');

Hoặc có thể sử dụng hàm old trong helper.

old('username')

chúng ta cũng có thể xác định thêm giá trị mặc định khi input không có giá trị bằng cách truyền vào tham số thứ 2.

Ví Dụ:

$username = $request->old('username', 'Trần Như Nhộng');

Input Trimming & Normalization.

Mặc định, Laravel 8 sử dụng 2 middleware App\Http\Middleware\TrimStringsApp\Http\Middleware\ConvertEmptyStringsToNull để làm nhiệm vụ xử lí, và chuẩn hóa dữ liệu trước khi đưa vào Request object.

  • Middleware TrimStrings có tác dụng loại bỏ đi các khoảng trống (white space) ở các input gửi lên request.
  • Middleware ConvertEmptyStringsToNull có tác dụng chuyển đổi string rỗng thành null.

Nếu như các bạn ko muốn tắt 2 middleware này đi thì có thể sửa trong app/Http/Kernel.php.

File

Bạn cũng có thể lấy ra được file upload lên trên request qua phương thức file. Phương thức này sẽ trả về một Object UploadedFile (Illuminate\Http\UploadedFile) nếu file đó tồn tại và null nếu file đó không tồn tại.

Object UploadedFile này được kế thừa từ SplFileInfo mặc định của PHP, nên bạn có thể sử dụng được các phương thức trong SplFileInfo.

Ví Dụ: Lấy ra thông tin file photo upload lên request.

$file = $request->file('photo');

Ngoài ra chúng ta cũng có thể trỏ trực tiếp đến file name qua property.

$file = $request->photo;

Trong trường hợp cần kiểm tra xem một file nào đó có xuất hiện trong request hay không thì chúng ta có thể sử dụng phương thức hasFile.

Ví Dụ: Kiểm tra xem request gửi lên có file photo không?

if ($request->hasFile('photo')) {
    //
}

Ngoài ra cũng có thể kiểm tra xem file được upload lên có thành công hay không. Bằng cách sử dụng phương thức isValid.

Ví Dụ:

if ($request->file('photo')->isValid()) {
    //
}

Lời Kết.

Bài học request trong Laravel 8 tạm thời mình sẽ dừng ở đây nhé các bạn, các phần sau có phần nào liên quan mình sẽ nói tại thời điểm đó luôn. Chúc các bạn học tốt!

Bình luận