Giới thiệu HTTP Request trong Laravel:
Class Illuminate\Http\Request cung cấp cách thức để tương tác với HTTP request bao gồm lấy dữ liệu, cookie, file … được gửi với request.
Tương tác với request:
Tiếp cận request:
Để đạt được 1 thể hiện của request thông qua dependency injection, bạn nên type-hint class Illuminate\Http\Request trong route closure hoặc trong method của controller. Request instance sẽ được inject bởi service container:
public function store(Request $request): RedirectResponse
{
$name = $request->input('name');
// store the user
return redirect('/users');
}Bạn cũng có thể type-hint Request trong route closure. Service container sẽ tự động inject request vào closure khi nó được thực thi:
Route::get('/', function(Request $request) {
// ...
});Tham số route trong dependency injection:
Nếu controller method nhận input từ tham số của route, thêm những tham số đó sau các dependencies. Ví dụ route định nghĩa như sau:
Route::put('/user/{id}', [UserController::class, 'update']);Trong method của controller:
public function update(Request $request, string $id): RedirectResponse
{
// update the user
return redirect('/users');
}Request path, host, method:
Request cung cấp nhiều method để kiểm tra request. Một số method quan trọng sau:
Truy xuất request path:
Trả về thông tin đường dẫn. Ví dụ request tại example.com/foo/bar thì method path trả về foo/bar:
$uri = $request->path();
// return 'foo/bar'Kiểm tra request path/route:
Method is cho phép bạn xác minh request path có khớp 1 pattern. Bạn có thể sử dụng * để ký tự đại diện khi sử dụng hàm này:
if ($request->is('admin/*')) ...Truy xuất request URL:
Method url trả về URL mà không có query string, còn fullUrl bao gồm cả query string:
$url = $request->url();
$urlWithQueryString = $request->fullUrl();Truy xuất host:
$request->host();
$request->httpHost();
$request->schemeAndHttpHost();Truy vấn method:
$request->method();
// or
if ($request->isMethod('post')) ...Request header:
$request->header('X-Header-Name');
if ($request->hasHeader('X-Header-Name')) { ... }
$token = $request->bearerToken();
// ip
$request->ip();Input trong Request:
Truy xuất input:
Truy vấn toàn bộ input data trả về dưới dạng mảng:
$input = $request->all();Trả về data dưới dạng collection:
$input = $request->collect();
$request->collect('users')->each(function(string $user) {
// ...
});Lấy giá trị 1 input:
$name = $request->input('name');
// pass default value
$name = $request->input('name', 'Sally');
$name = $request->input('products.0.name');
$names = $request->input('products.*.name');Truy xuất input từ query string:
$name = $request->query('name');Truy xuất Json Input:
Khi gửi Json request (header set Content-Type là application/json):
$name = $request->input('user.name');Xác định input có tồn tại:
if ($request->has('name')
if ($request->has(['name', 'email'])
if ($request->hasAny(['name', 'email'])Input cũ:
Laravel cho phép giữ input từ 1 request trước. Tính năng này cho phép giữ lại thông tin khi form validation error. Tuy nhiên khi sử dụng tính năng validation của Laravel, bạn không cần sử dụng bằng tay method session input flash, validation sẽ tự động gọi.
Hàm flash sẽ flash input vào session và nó sẽ có sẵn trong request tiếp theo:
$request->flash();
// chọn lọc:
$request->flashOnly(['name', 'email']);
// loại trừ:
$request->flashExcept('password');Flash input khi redirect:
Nếu bạn cần flash input vào session và redirect về page trước, sử dụng method withInput:
return redirect('form')->withInput();
return redirect()->route('user.create')->withInput();
return redirect('form')->withInput(
$request->except('password')
);Truy xuất input cũ:
Dùng method old:
$username = $request->old('username');Trong blade template:
<input type="text" name="username" value="{{ old('username') }}">Cookie:
Truy xuất cookie từ request:
$value = $request->cookie('name');Input trimming & normalization:
Mặc định Laravel include 2 middleware App\Http\Middleware\TrimStrings và Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull vào middleware global của ứng dụng. Những middleware này sẽ tự động trim các string field của request, cũng như convert các string rỗng thành null. Điều này cho phép bạn không phải lo lắng về việc normalize nó trong route và controller.
Disable input normalization:
Để disable cho tất cả request, bạn có thể gỡ 2 middleware ra khỏi ứng dụng bằng cách gỡ nó từ thuộc tính $middleware trong class App\Http\Kernel.
Nếu bạn muốn gỡ cho 1 số request nhỏ, bạn dùng method skipWhen được cung cấp bởi cả 2 middleware. Thông thường method này được gọi ở method boot của AppServiceProvider.
public function boot(): void
{
TrimStrings::skipWhen(function(Request $request) {
return $request->is('admin/*');
})
ConvertEmptyStringsToNull::skipWhen(function(Request $request) {
// ...
});
}Files trong Request:
Xử lý upload file:
Bạn có thể truy xuất upload file sử dụng method file hoặc sử dụng thuộc tính động. Method file trả về 1 instance của class Illuminate\Http\UploadedFile, extends SplFileInfo và cung cấp nhiều method tương tác với file:
$file = $request->file('photo');
$file = $request->photo;
// kiểm tra 1 file tồn tại hay không:
if ($request->hasFile('photo'))Validate upload thành công:
Sử dụng hàm isValid để kiểm tra có vấn đề gì khi upload file không:
if ($request->file('photo')->isValid())File path và extension:
Class UploadFile có những method để tiếp cận file. Method extension trả về định dạng file. Định dạng này có thể khác với định dạng được gửi lên bởi trình duyệt:
$path = $request->photo->path();
$extension = $request->photo->extension();Lưu trữ uploaded file:
Class UploadFile có method store để di chuyển 1 upload file đến bộ nhớ của bạn, có thể trên cloud Amazone S3.
Method store chấp nhận tham số thứ 2 (tùy chọn) là tên của ổ đĩa bạn sẽ lưu file. Method này trả về đường dẫn của file liên quan đến thư mục gốc ổ đĩa:
$path = $request->photo->store('images');
$path = $request->photo->store('images', 's3');Nếu bạn không muốn 1 tên file được tự động tạo, bạn sử dụng method storeAs:
$path = $request->photo->storeAs('images', 'filename.jpg');
$path = $request->photo->storeAs('images', 'filename.jpg', 's3');