Laravel: Tìm hiểu về HTTP Requests (Phần 2)
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ầ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ừ ```IlluminateHttpRequest``` 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=names = names=request->input('products.*.name');
<br> **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 ```IlluminateHttpRequest```. 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=name = 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. <br> **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=name = name=request->input('user.name');
<br> **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=input = input=request->only(['username', 'password']);
input=input = input=request->only('username', 'password');
input=input = input=request->except(['credit_card']);
input=input = 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=input = input=request->intersect(['username', 'password']);
<br> **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 ($$equest->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 ($$equest->has(['name', 'email'])) { // }
<br> ### 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](https://laravel.com/docs/5.4/validation) 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. <br> **Flashing Input To The Session** Phương thức ```flash``` trong class ```IlluminateHttpRequest``` 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:
$$equest->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:
$$equest->flashOnly(['username', 'email']);
$$equest->flashExcept('password');
<br> **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( $$equest->except('password') );
<br> **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](https://laravel.com/docs/5.4/session):
username=username = 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](https://laravel.com/docs/5.4/blade), 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 ```IlluminateHttpRequest``` 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 ```IlluminateHttpResponse``` 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](https://secure.php.net/manual/en/function.setcookie.php) 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 ```SymfonyComponentHttpFoundationCookie``` 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($$ookie);
<br> ## Files <br> ### Retrieving Uploaded Files <br> Bạn có thể lấy file được upload từ một instance của ```IlluminateHttpRequest``` bằng cách sử dụng phương thức ``f`ile``` hoặc sử dụng thuộc tính động. Phương thức ```file``` sẽ trả về một instance của class ```IlluminateHttpUploadedFile```, 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=file = file=request->file('photo');
file=file = 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 ($$equest->hasFile('photo')) { // }
<br> **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 ($$equest->file('photo')->isValid()) { // }
<br> **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=path = path=request->photo->path();
extension=extension = extension=request->photo->extension();
<br> **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](http://api.symfony.com/3.0/Symfony/Component/HttpFoundation/File/UploadedFile.html) để biết thêm chi tiết các phương thức này. <br> ### Storing Uploaded Files <br> Để lưu một file được upload, thông thường sử dụng một trong những cấu hình [filesystems](https://laravel.com/docs/5.4/filesystem). 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=path = path=request->photo->store('images');
path=path = 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=path = path=request->photo->storeAs('images', 'filename.jpg');
path=path = path=request->photo->storeAs('images', 'filename.jpg', 's3');