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');
//
}
}
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;
$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();
}
$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;
$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;
𝑟𝑒𝑞𝑢𝑒𝑠𝑡−>𝑚𝑒𝑡ℎ𝑜𝑑()𝑣à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';
}
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');
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';
}
}
Ok, chúng ta thử truy cập đường dẫn http://laravel.dev/category/laravel-nang-cao?page=3&lang=vn
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;
$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;
$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;
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');
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;
}
Ok, truy cập đường dẫn http://laravel.dev/user-info
Ở đâ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');
ở đâ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');
Tạo ContactController cho project:
php artisan make:controller ContactController
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');
}
}
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>
Chúng ta đã hoàn thành 50%, giờ thử truy cập http://laravel.dev/contact
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');
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]);
}
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>
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ệ:
Nhấn nút gửi, nó sẽ qua route:
Route::post('contact', 'ContactController@insertMessage');
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:
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.