X

Laravel: Tìm hiểu về HTTP Requests (Phần 2)

Phần 1: Tài liệu: Laravel: Tìm hiểu về HTTP Requests (Phần 1)

Chúng ta sẽ cùng tiếp tục đến với phần 2 tìm hiểu thêm về các loại Request trong Laravel nhé. Việc nắm chắc được các request thì bạn có thể thiết kế web 1 cách chuyên nghiệp hoặc tối ưu được SEO cho dự án của mình rồi.

Lấy tất cả dữ liệu trong Laravel

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');

Lấy user input bằng cách sử dụng thuộc tính động

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.

Lấy dữ liệu JSON qua phương thức input

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');

Lấy một tập con dữ liệu input

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 onlyexcept. 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']);

Kiểm tra giá trị input tồn tại trong request

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 - Lấy giá trị từ lần request cữ tới request tiếp theo

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 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 flashOnlyflashExcept để 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 :

$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 , 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 trong Laravel

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 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);

Quản lý File trong Laravel

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ứcfilesẽ trả về một instance của classIlluminate\Http\UploadedFile, nó kế thừa từ classSplFileInfo``` 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 để biết thêm chi tiết các phương thức này.

Lưu trữ upload File trong laravel

Để lưu một file được upload, thông thường sử dụng một trong những cấu hình . 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');