Laravel: Tìm hiểu về HTTP Requests (Phần 2)
Bài đăng này đã không được cập nhật trong 6 năm
Phần 1: https://viblo.asia/p/laravel-tim-hieu-ve-http-requests-phan-1-XL6lAwzDKek Tài liệu: https://laravel.com/docs/5.4/requests
Chúng ta sẽ cùng tiếp tục đến với phần 2:
Retrieving Input
Retrieving All Input Data
Bạn có thể lấy tất cả dữ liệu input như một array
bằng cách sử dụng phương thức all
:
$input = $request->all();
Retrieving An Input Value
Sử dụng một vài phương thức cơ bản, bạn có thể truy cập tất cả các user input từ Illuminate\Http\Request
mà bạn không cần quan tâm tới các method HTTP được sử dụng cho request. Bất kể nó là phương thức HTTP nào, phương thức input
có thể được sử dụng để lấy user input:
$name = $request->input('name');
Bạn cũng có thể vượt qua một giá trị mặc định như là một đối số thứ hai trong phương thức input
. Giá trị sẽ được trả về nếu giá trị input không có trong request:
$name = $request->input('name', 'Sally');
Khi bạn làm việc với form chứa array input, sử dụng dấm "." để truy cập giá trị của mảng:
$name = $request->input('products.0.name');
$names = $request->input('products.*.name');
Retrieving Input Via Dynamic Properties
Bạn có thể lấy user input bằng cách sử dụng thuộc tính động trong Illuminate\Http\Request
. Ví dụ, nếu một trong những form trong ứng dụng của bạn có chứa trường name
, bạn có thể truy cập lấy giá trị bằng cách:
$name = $request->name;
Khi sử dụng thuộc tính động, đầu tiên Laravel sẽ tìm giá trị tham số trong request payload. Nếu nó không tìm thấy, Laravel sẽ tìm kiếm field trong các tham số route.
Retrieving JSON Input Values
Khi gửi JSON requests đến ứng dụng của bạn, bạn có thể lấy dữ liệu JSON qua phương thức input
miễn là Content-Type
header của request được set là application/json
. Bạn cũng có thể dùng dấu "." để lấy giá trị mảng JSON:
$name = $request->input('user.name');
Retrieving A Portion Of The Input Data
Nếu bạn cần lấy một tập con dữ liệu input, bạn có thể sử dụng phương thức only
và except
. Cả hai phương thức đều nhận một array
hoặc một danh sách động các đối số:
$input = $request->only(['username', 'password']);
$input = $request->only('username', 'password');
$input = $request->except(['credit_card']);
$input = $request->except('credit_card');
Phương thức only
trả về tất cả các cặp key / value mà bạn yêu cầu, ngay cả khi key không có trong request gửi đến. Khi key không có trong request, value sẽ trả về null
. Nếu bạn muốn lấy lại một phần dữ liệu đầu vào thực sự có trong request, bạn có thể sử dụng phương thức intersect
:
$input = $request->intersect(['username', 'password']);
Determining If An Input Value Is Present
Bạn nên sử dụng phương thức has
để kiểm tra giá trị input tồn tại trong request. Phương thức has
trả về true
nếu giá trị tồn tại và không phải chuỗi rỗng:
if ($request->has('name')) {
//
}
Khi trả về một array, phương thức has
sẽ xác định xem tất cả các giá trị được chỉ định có mặt:
if ($request->has(['name', 'email'])) {
//
}
Old Input
Laravel cho phép bạn giữ giá trị input từ lần request cữ tới request tiếp theo. Nó thật sự hữu dụng khi bạn muốn thiết lập lại form sau khi có validate lỗi. Tuy nhiên, nếu bạn sử dụng validation features của Laravel, thì bạn không phải làm việc này, vì Laravel's built-in validation sẽ tự động làm việc đó cho bạn.
Flashing Input To The Session
Phương thức flash
trong class Illuminate\Http\Request
sẽ flash đầu vào hiện tại cho phiên làm việc để nó có sẵn trong request tiếp theo của người dùng đến ứng dụng:
$request->flash();
Bạn cũng có thể sử dụng phương thức flashOnly
và flashExcept
để flash một tập con dữ liệu request vào trong session. Phương thức này rất hữu ích cho việc lưu giữ những thông tin nhạy cảm như mật khẩu ra session:
$request->flashOnly(['username', 'email']);
$request->flashExcept('password');
Flashing Input Then Redirecting
Vì bạn thường sẽ muốn flash vào sesion và sau đó chuyển hướng đến trang trước, bạn có thể dễ dàng làm việc đó bằng cách sử dụng phương thức withInput
:
return redirect('form')->withInput();
return redirect('form')->withInput(
$request->except('password')
);
Retrieving Old Input
Để lấy flashed input từ request trước, sử dụng phương thức old
của Request
. Phương thức old
sẽ lấy dữ liệu flashed input ra khỏi session:
$username = $request->old('username');
Laravel cũng cung cấp một global old helper. Nếu bạn muốn hiển thị old input trong Blade template, nó thật tiện khi sử dụng helper old
. Nếu không có old input của trường đó, null
sẽ được trả về:
<input type="text" name="username" value="{{ old('username') }}">
Cookies
Retrieving Cookies From Requests
Tất cả cookies được tạo bởi Laravel framework đều được mã hóa và đăng ký một mã xác thực, nghĩa là chúng có thể bị coi là không hợp lệ nếu nó bị thay đổi từ phía client. Để lấy một giá trị cookie từ request, sử dụng phương thức cookie
trên Illuminate\Http\Request
instance:
$value = $request->cookie('name');
Attaching Cookies To Responses
Bạn có thể gắp một cookie với một đối tương Illuminate\Http\Response
bằng cách sử dụng phương thức cookie
. Bạn có thể truyền tên, giá trị, và số phút cookie sẽ hết hạn vào phương thức:
return response('Hello World')->cookie(
'name', 'value', $minutes
);
Ngoài ra phương thức cookie
còn có một vài đối sô ít được sử dụng. Nói chung, những đối số này có cùng mục đích và ý nghĩa giống với đối số của setcookie của PHP thuần túy:
return response('Hello World')->cookie(
'name', 'value', $minutes, $path, $domain, $secure, $httpOnly
);
Generating Cookie Instances
Nếu bạn muốn tạo một Symfony\Component\HttpFoundation\Cookie
instance có thể được response instance sau một khoảng thời gian, bạn có thể sử dụng global cookie
helper. Khi đó cookie sẽ không gửi lại cho client trừ khi nó được gán vào response instance:
$cookie = cookie('name', 'value', $minutes);
return response('Hello World')->cookie($cookie);
Files
Retrieving Uploaded Files
Bạn có thể lấy file được upload từ một instance của Illuminate\Http\Request
bằng cách sử dụng phương thức ``f`ilehoặc sử dụng thuộc tính động. Phương thức
filesẽ trả về một instance của class
Illuminate\Http\UploadedFile, nó kế thừa từ class
SplFileInfo``` của PHP và cung cấp một số phương thức để tương tác với file:
$file = $request->file('photo');
$file = $request->photo;
Bạn có thể xác định 1 file có trên request hay không bằng cách sử dụng phương thức hasFile
:
if ($request->hasFile('photo')) {
//
}
Validating Successful Uploads
Ngoài việc kiểm tra file upload tồn tại, bạn có thể kiểm tra xem có vấn đề gì khi upload file bằng phương thức isValid
:
if ($request->file('photo')->isValid()) {
//
}
File Paths & Extensions
Class UploadedFile
ngoài ra còn chứa phương thức để lấy đường dẫn đầy đủ và extension của file. Phương thức extension
sẽ cho phép đoán extension dựa vào nội dung của file. Extension này có thể khác với extension được cung cấp bởi client:
$path = $request->photo->path();
$extension = $request->photo->extension();
Other File Methods
Có một số phương thức tồn tại trong class UploadedFile
. Chi tiết xem tại API documentation for the class để biết thêm chi tiết các phương thức này.
Storing Uploaded Files
Để lưu một file được upload, thông thường sử dụng một trong những cấu hình filesystems. Class UploadedFile
có phương thức store
nó sẽ chuyển file upload từ ổ cứng của bạn đến một nơi có thể là trên local của bạn hoặc ngay cả trên cloud storage như Amazon S3.
Phương thức store
chấp nhận đường dẫn file nên được lưu trữ đường dẫn tương đối so với thư mục gốc cấu hình của filesystem. Đường dẫn không nên chứa tên file, vì 1 ID unique sẽ tự động được sinh ra để tạo tên file.
Phương thức store
ngoài ra còn chấp nhận tham số thứ hai có tên của nơi mà bạn sử dụng để lưu file. Phương thức sẽ trả về đường dẫn tương đối của file đối với thư mục gốc:
$path = $request->photo->store('images');
$path = $request->photo->store('images', 's3');
Nếu bạn không muốn tên file được tự động tạo ra, bạn có thể sử dụng phương thức storeAs
, nó sẽ chấp nhận các đối số như đường dẫn, tên file, và tên nơi lưu:
$path = $request->photo->storeAs('images', 'filename.jpg');
$path = $request->photo->storeAs('images', 'filename.jpg', 's3');
All rights reserved