post-image

HTTP Request trong Laravel

Tổng quan

Truy cập dữ liệu từ yêu cầu HTTP

Laravel Request cung cấp dữ liệu về các yêu cầu HTTP cũng như cho phép thao tác với các yêu cầu này. Chúng ta có thể tạo một instance của HTTP request thông qua method injection (xem bài trước Laravel Controller), đơn giản là gọi đến class Illuminate\Http\Request trong phương thức của controller. Một instance của yêu cầu trang web sẽ được injection tự động bởi service container. Ví dụ:

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class UserController extends Controller { public function store(Request $request) { $name = $request->input('name'); // } }
Code language: HTML, XML (xml)

Trong ví dụ trên $request là một instance của incoming request, có thể lấy dữ liệu được nhập vào trường name.

Các phương thức của Request

$request->path()

Phương thức path trả về thông tin đường dẫn yêu cầu, ví dụ với đường dẫn http://laravel.dev/category/laravel-nang-cao thì phương thức path trả về category/laravel-nang-cao.

// ví dụ URL http://laravel.dev/category/laravel-nang-cao $uri = $request->path(); // trả về category/laravel-nang-cao echo $uri;
Code language: PHP (php)

$request->is()

Phương thức is cho phép kiểm tra xem đường dẫn yêu cầu có khớp với một mẫu, sử dụng ký tự * để trùng khớp tất cả các chuỗi.

if ($request->is('admin/*')) { // các đường dẫn bắt đầu bằng admin/ được xử lý // ví dụ http://laravel.dev/admin/product/create, http://laravel.dev/admin/news/create } if ($request->is('category/laravel-nang-cao')) { echo 'Đường dẫn bạn vừa truy nhập đúng là http://laravel.dev/' . $request->path(); }
Code language: PHP (php)

$request->url()

Phương thức này trả về đường dẫn đầy đủ của URL không có query string, query string là đoạn đằng sau dấu ? trong URL, ví dụ http://laravel.dev/category/laravel-nang-cao?page=3&lang=vn thì page=3&lang=vn chính là query string dùng để truyền giá trị giữa các trang web.

// ví dụ đường dẫn http://laravel.dev/category/laravel-nang-cao?page=3&lang=vn $url = $request->url(); // trả về http://laravel.dev/category/laravel-nang-cao echo $url;
Code language: PHP (php)

$request->fullurl()

Phương thức này trả về đường dẫn URL đầy đủ cả query string

// ví dụ đường dẫn http://laravel.dev/category/laravel-nang-cao?page=3&lang=vn $full_url = $request->fullurl(); // trả về http://laravel.dev/category/laravel-nang-cao?page=3&lang=vn echo $full_url;
Code language: PHP (php)

𝑟𝑒𝑞𝑢𝑒𝑠𝑡−>𝑚𝑒𝑡ℎ𝑜𝑑()𝑣àrequest−>method()vàrequest->isMethod()

Phương thức này trả về cách thức yêu cầu gửi là GET hay POST, có thể sử dụng phương thức isMethod để kiểm tra cách thức gửi yêu cầu:

$method = $request->method(); if ($request->isMethod('post')) { echo 'POST request'; } else { echo 'GET request'; }
Code language: PHP (php)

Ví dụ về các phương thức của Request

Chúng ta sẽ thực hành một ví dụ có tất cả các phương thức của Request đã nói đến ở trên, để cho nhanh chúng ta sẽ sử dụng MainController đã tạo ra từ bài Laravel Route. Thêm một route vào routes/web.php

Route::get('category/laravel-nang-cao', 'MainController@uriTest');
Code language: PHP (php)

Sau đó thêm phương thức uriTest vào app/Http/Controllers/MainController.php:

public function uriTest(Request $request){ // ví dụ URL http://laravel.dev/category/laravel-nang-cao $uri = $request->path(); // trả về category/laravel-nang-cao echo $uri; if ($request->is('admin/*')) { // các đường dẫn bắt đầu bằng admin/ được xử lý // ví dụ http://laravel.dev/admin/product/create, http://laravel.dev/admin/news/create echo '<br>Admin path'; } if ($request->is('category/laravel-nang-cao')) { echo '<br>Đường dẫn bạn vừa truy nhập đúng là http://laravel.dev/' . $request->path(); } // ví dụ đường dẫn http://laravel.dev/category/laravel-nang-cao?page=3&lang=vn $url = $request->url(); // trả về http://laravel.dev/category/laravel-nang-cao echo '<br>Đường dẫn đầy đủ: ' . $url; // ví dụ đường dẫn http://laravel.dev/category/laravel-nang-cao?page=3&lang=vn $full_url = $request->fullurl(); // trả về http://laravel.dev/category/laravel-nang-cao?page=3&lang=vn echo '<br>Đường dẫn đầy đủ cả query string' . $full_url; $method = $request->method(); if ($request->isMethod('post')) { echo '<br>POST request'; } else { echo '<br>GET request'; } }
Code language: PHP (php)

Ok, chúng ta thử truy cập đường dẫn http://laravel.dev/category/laravel-nang-cao?page=3&lang=vn

Ví dụ các phương thức của Request trong Laravel

Các phương thức liên quan đến người dùng của Request

Request cung cấp một số phương thức giúp tìm hiểu về người dùng rất tốt, chúng ta cùng tìm hiểu. #### $request->ip()

Phương thức ip trả về địa chỉ ip của người dùng.

$ip_address = $request->ip(); echo '<br>Địa chỉ IP người dùng: ' . $ip_address;
Code language: PHP (php)

$request->server()

Phương thức server trả về các thông tin liên quan đến máy chủ ở dạng mảng. Một số các thông tin thường sử dụng như: – URL_REFERER: đường dẫn url tham chiếu

  • REQUEST_TIME: thời gian yêu cầu gửi đến máy chủ web
  • QUERY_STRING: query string trong URL
  • SERVER_ADDR: Địa chỉ máy chủ
  • REQUEST_SCHEME: giao thức sử dụng
$server_address = $request->server('SERVER_ADDR'); echo '<br>Địa chỉ IP máy chủ: ' . $server_address; $url_referer = $request->server('URL_REFERER'); echo '<br>Đường dẫn xuất phát: ' . $url_referer;
Code language: PHP (php)

$request->header()

Phương thức header trả về các thông tin header của request dưới dạng mảng bao gồm thông tin về host yêu cầu, thông tin về trình duyệt sử dụng user-agent, dữ liệu cookie… Trong các thông tin này thông tin về trình duyệt user-agent thường được sử dụng:

$user_agent = $request->header('User-Agent'); echo $user_agent;
Code language: PHP (php)

Chúng ta cùng thực hành ví dụ các phương thức liên quan đến người dùng: thêm route vào routes/web.php

Route::get('user-info', 'MainController@getUserInfo');
Code language: PHP (php)

Thêm phương thức getUserInfo vào MainController

public function getUserInfo(Request $request){ $ip_address = $request->ip(); echo '<br>Địa chỉ IP người dùng: ' . $ip_address; $server_address = $request->server('SERVER_ADDR'); echo '<br>Địa chỉ IP máy chủ: ' . $server_address; $url_referer = $request->server('URL_REFERER'); echo '<br>Đường dẫn xuất phát: ' . $url_referer; $user_agent = $request->header('User-Agent'); echo '<br> Thông tin về trình duyệt:' . $user_agent; }
Code language: PHP (php)

Ok, truy cập đường dẫn http://laravel.dev/user-info

Ví dụ các phương thức liên quan đến người dùng của Request trong Laravel

Ở đây IP người dùng và IP máy chủ đều là 127.0.0.1 do chúng ta đang chạy trên máy cục bộ, nếu bạn đưa lên máy chủ trên mạng sẽ thấy thông tin khác đi.

Lấy thông tin nhập liệu trong Form từ Request

Các giá trị nhập liệu từ form có thể lấy dễ dàng trong Laravel, với cả phương thức yêu cầu GET và POST bằng cú pháp:

$phone = $request->input('phone');
Code language: PHP (php)

ở đây phone chính là tên trường trong form nhập liệu. Chúng ta sẽ bắt đầu bằng một ví dụ rất thực tế: Tạo một form liên hệ, lấy thông tin nhập vào form này và cập nhật vào database.

Bước 1: Tạo form yêu cầu và route cho form yêu cầu.

Thêm một route vào routes/web.php

Route::get('contact', 'ContactController@showContactForm');
Code language: PHP (php)

Tạo ContactController cho project:

php artisan make:controller ContactController
Code language: CSS (css)

Thêm phương thức showContactForm vào ContactController:

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class ContactController extends Controller { public function showContactForm(){ return view('fontend.contact'); } }
Code language: HTML, XML (xml)

Tiếp theo tạo view chứa contact form, tạo file có tên contact.blade.php trong thư mục resources/views/fontend với nội dung sau:

<html> <head> <title>Contact us - Allaravel.com Example</title> <link href = "https://fonts.googleapis.com/css?family=Arial:100" rel = "stylesheet" type = "text/css"> <style> html, body { height: 100%; } body { margin: 0; padding: 0; width: 100%; display: table; font-weight: 100; font-family: 'Arial'; } .container { text-align: center; display: table-cell; vertical-align: middle; } .content { text-align: center; display: inline-block; } .title { font-size: 96px; } </style> </head> <body> <div class = "container"> <div class = "content"> <form action = "/contact" method = "post"> <input type = "hidden" name = "_token" value = "<?php echo csrf_token() ?>"> <table> <tr> <td>Họ và tên</td> <td><input type = "text" name = "name" /></td> </tr> <tr> <td>Tiêu đề</td> <td><input type = "text" name = "title" /></td> </tr> <tr> <td>Nội dung</td> <td> <textarea name="message" rows="5"></textarea> </td> </tr> <tr> <td colspan = "2" align = "center"> <input type = "submit" value = "Gửi" /> </td> </tr> </table> </form> </div> </div> </body> </html>
Code language: HTML, XML (xml)

Chúng ta đã hoàn thành 50%, giờ thử truy cập http://laravel.dev/contact

Ví dụ cách thức lấy dữ liệu trong form Laravel

Tiếp theo chúng ta thực hiện nhập dữ liệu vào form và bắt các giá trị nhập liệu phía server và cập nhật vào database. Thêm route vào routes/web.php

Route::post('contact', 'ContactController@insertMessage');
Code language: PHP (php)

Thêm phương thức insertMessage vào ContactController, phương thức này có nhiệm vụ lấy dữ liệu người dùng nhập vào và cập nhật vào database sau đó hiển thị thông báo cho người dùng là đã ghi nhận message vào hệ thống.

public function insertMessage(Request $request){ $name = $request->input('name'); $title = $request->input('title'); $message = $request->input('message'); // Insert message vào database, tạm thời coi như đã cập nhật database // chúng ta sẽ trở lại phần này trong những bài viết sau return view('fontend.contact')->with(['success' => 'Bạn đã gửi tin nhắn thành công!', 'name' => $name, 'title' => $title, 'message' => $message]); }
Code language: PHP (php)

Thay đổi chút view contact (resources/views/fontend/contact.blade.php):

<html> <head> <title>Contact us - Allaravel.com Example</title> <link href = "https://fonts.googleapis.com/css?family=Arial:100" rel = "stylesheet" type = "text/css"> <style> html, body { height: 100%; } body { margin: 0; padding: 0; width: 100%; display: table; font-weight: 100; font-family: 'Arial'; } .container { text-align: center; display: table-cell; vertical-align: middle; } .content { text-align: center; display: inline-block; } .title { font-size: 96px; } </style> </head> <body> <div class = "container"> <div class = "content"> <div> <?php if(isset($success)){ echo $success . '<br>' . 'Nội dung tin nhắn như sau:' . '<br>' . 'Họ tên:' . $name . '<br>' . 'Tiêu đề' . $title . '<br>' . 'Nội dung' . $message; } ?> </div> <form action = "/contact" method = "post"> <input type = "hidden" name = "_token" value = "<?php echo csrf_token() ?>"> <table> <tr> <td>Họ và tên</td> <td><input type = "text" name = "name" /></td> </tr> <tr> <td>Tiêu đề</td> <td><input type = "text" name = "title" /></td> </tr> <tr> <td>Nội dung</td> <td> <textarea name="message" rows="5"></textarea> </td> </tr> <tr> <td colspan = "2" align = "center"> <input type = "submit" value = "Gửi" /> </td> </tr> </table> </form> </div> </div> </body> </html>
Code language: HTML, XML (xml)

Ok, chúng ta kiểm tra xem trang web hoạt động như thế nào. Truy cập http://laravel.dev/contact và nhập các thông tin liên hệ:

vi du cach thuc lay gia tri form nhap lieu trong laravel 2

Nhấn nút gửi, nó sẽ qua route:

Route::post('contact', 'ContactController@insertMessage');
Code language: PHP (php)

Trong insertMessage nó lấy thông tin từ các trường nhập liệu, cập nhật thông tin này vào database (ở ví dụ này chúng ta giả sử đã cập nhật dữ liệu vào database do phần kiến thức này sẽ được giới thiệu trong những bài tiếp theo). Sau khi cập nhật thông tin vào database xong nó điều hướng lại về chính view contact với các giá trị như lời nhắn thành công và nội dung các trường đã nhập liệu, trong phần view contact chúng ta kiểm tra nếu có lời nhắn thành công thì hiển thị nó kèm theo thông tin đã nhập liệu. Kết quả như hình tiếp theo:

vi du cach thuc lay gia tri form nhap lieu trong laravel 3

Lời kết

Chúng ta đã làm quen với Laravel Request và rất nhiều ví dụ có tính thực tế, tuy nhiên kiến thức phần này còn rất nhiều nhưng do khuôn khổ có hạn, chúng tôi sẽ còn quay lại những vấn đề khác liên quan đển Laravel Request. Bạn đọc trong quá trình thực hành có thắc mắc hoặc góp ý, xin vui lòng comment dưới bài, chúng tôi sẽ trả lời bạn sớm nhất.

Cảm ơn các bạn đã đọc.

Các bạn có thể tham khảo các bài viết hay về Laravel tại đây.


Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.

Nguồn tham khảo: allaravel

Leave a Reply

Your email address will not be published. Required fields are marked *