Giới thiệu
Nhận đối tượng yêu cầu
Webman sẽ tự động chèn đối tượng yêu cầu vào tham số đầu tiên của phương thức action, ví dụ
Ví dụ
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
$default_name = 'webman';
// Nhận tham số name từ yêu cầu get, nếu không truyền tham số name thì trả về $default_name
$name = $request->get('name', $default_name);
// Trả về chuỗi đến trình duyệt
return response('hello ' . $name);
}
}
Thông qua đối tượng $request
, chúng ta có thể truy xuất bất kỳ dữ liệu nào liên quan đến yêu cầu.
Đôi khi chúng ta muốn lấy đối tượng $request
hiện tại trong các lớp khác, lúc này chúng ta chỉ cần sử dụng hàm trợ giúp request()
là đủ;
Nhận tham số yêu cầu get
Nhận toàn bộ mảng get
$request->get();
Nếu yêu cầu không có tham số get thì sẽ trả về một mảng rỗng.
Nhận giá trị của một mảng get
$request->get('name');
Nếu mảng get không bao gồm giá trị này thì sẽ trả về null.
Bạn cũng có thể truyền cho phương thức get tham số thứ hai một giá trị mặc định, nếu không tìm thấy giá trị tương ứng trong mảng get thì sẽ trả về giá trị mặc định. Ví dụ:
$request->get('name', 'tom');
Nhận tham số yêu cầu post
Nhận toàn bộ mảng post
$request->post();
Nếu yêu cầu không có tham số post thì sẽ trả về một mảng rỗng.
Nhận giá trị của một mảng post
$request->post('name');
Nếu mảng post không bao gồm giá trị này thì sẽ trả về null.
Cũng giống như phương thức get, bạn cũng có thể truyền cho phương thức post tham số thứ hai một giá trị mặc định, nếu không tìm thấy giá trị tương ứng trong mảng post thì sẽ trả về giá trị mặc định. Ví dụ:
$request->post('name', 'tom');
Hàm trợ giúp input()
Tương tự như hàm $request->input()
, có thể lấy được tất cả các tham số, hàm input() có hai tham số:
- name: Tên tham số cần lấy (Nếu để trống, có thể lấy toàn bộ tham số dưới dạng mảng)
- default: Giá trị mặc định (Khi không lấy được tham số qua tham số đầu tiên, sẽ sử dụng giá trị của tham số này)
Ví dụ
// Nhận tham số name
$name = input('name');
// Nhận tham số name, nếu không tồn tại thì sử dụng giá trị mặc định
$name = input('name','张三');
// Nhận toàn bộ tham số
$all_params = input();
Nhận nội dung gốc của gói post yêu cầu
$post = $request->rawBody();
Chức năng này tương tự với thao tác php-fpm
trong file_get_contents("php://input");
. Dùng để nhận nội dung gốc của yêu cầu http. Điều này rất hữu ích khi nhận dữ liệu yêu cầu post không theo định dạng application/x-www-form-urlencoded
.
Nhận header
Nhận toàn bộ mảng header
$request->header();
Nếu yêu cầu không có tham số header thì sẽ trả về một mảng rỗng. Lưu ý rằng tất cả key đều được viết thường.
Nhận giá trị của một mảng header
$request->header('host');
Nếu mảng header không bao gồm giá trị này thì sẽ trả về null. Lưu ý rằng tất cả key đều được viết thường.
Cũng giống như phương thức get, bạn cũng có thể truyền cho phương thức header tham số thứ hai một giá trị mặc định, nếu không tìm thấy giá trị tương ứng trong mảng header thì sẽ trả về giá trị mặc định. Ví dụ:
$request->header('host', 'localhost');
Nhận cookie
Nhận toàn bộ mảng cookie
$request->cookie();
Nếu yêu cầu không có tham số cookie thì sẽ trả về một mảng rỗng.
Nhận giá trị của một mảng cookie
$request->cookie('name');
Nếu mảng cookie không bao gồm giá trị này thì sẽ trả về null.
Cũng giống như phương thức get, bạn cũng có thể truyền cho phương thức cookie tham số thứ hai một giá trị mặc định, nếu không tìm thấy giá trị tương ứng trong mảng cookie thì sẽ trả về giá trị mặc định. Ví dụ:
$request->cookie('name', 'tom');
Nhận tất cả dữ liệu đầu vào
Bao gồm kết hợp post
và get
.
$request->all();
Nhận giá trị đầu vào cụ thể
Truy xuất giá trị từ tập hợp post
và get
.
$request->input('name', $default_value);
Nhận một phần dữ liệu đầu vào
Truy xuất một phần dữ liệu từ tập hợp post
và get
.
// Nhận mảng bao gồm username và password, nếu key tương ứng không có thì bỏ qua
$only = $request->only(['username', 'password']);
// Nhận tất cả dữ liệu ngoại trừ avatar và age
$except = $request->except(['avatar', 'age']);
Nhận đầu vào thông qua tham số của bộ điều khiển
<?php
namespace app\controller;
use support\Response;
class UserController
{
public function create(string $name, int $age = 18): Response
{
return json(['name' => $name, 'age' => $age]);
}
}
Logic mã tương tự như
<?php
namespace app\controller;
use support\Request;
use support\Response;
class UserController
{
public function create(Request $request): Response
{
$name = $request->input('name');
$age = (int)$request->input('age', 18);
return json(['name' => $name, 'age' => $age]);
}
}
Thông tin thêm, vui lòng tham khảo Ràng buộc tham số của bộ điều khiển
Nhận tệp tải lên
Lưu ý
Tệp tải lên cần sử dụng định dạng biểu mẫumultipart/form-data
Nhận toàn bộ mảng tệp tải lên
$request->file();
Biểu mẫu tương tự:
<form method="post" action="http://127.0.0.1:8787/upload/files" enctype="multipart/form-data" />
<input name="file1" multiple="multiple" type="file">
<input name="file2" multiple="multiple" type="file">
<input type="submit">
</form>
Định dạng trả về của $request->file()
tương tự như:
array (
'file1' => object(webman\Http\UploadFile),
'file2' => object(webman\Http\UploadFile)
)
Nó là một mảng các instance của webman\Http\UploadFile
. Lớp webman\Http\UploadFile
kế thừa từ lớp SplFileInfo
được tích hợp trong PHP và cung cấp một số phương thức hữu ích.
<?php
namespace app\controller;
use support\Request;
class UploadController
{
public function files(Request $request)
{
foreach ($request->file() as $key => $spl_file) {
var_export($spl_file->isValid()); // Tệp có hợp lệ hay không, ví dụ true|false
var_export($spl_file->getUploadExtension()); // Phần mở rộng tệp tải lên, ví dụ 'jpg'
var_export($spl_file->getUploadMimeType()); // Loại mime của tệp tải lên, ví dụ 'image/jpeg'
var_export($spl_file->getUploadErrorCode()); // Nhận mã lỗi tải lên, ví dụ UPLOAD_ERR_NO_TMP_DIR UPLOAD_ERR_NO_FILE UPLOAD_ERR_CANT_WRITE
var_export($spl_file->getUploadName()); // Tên tệp tải lên, ví dụ 'my-test.jpg'
var_export($spl_file->getSize()); // Nhận kích thước tệp, ví dụ 13364, đơn vị byte
var_export($spl_file->getPath()); // Nhận thư mục tải lên, ví dụ '/tmp'
var_export($spl_file->getRealPath()); // Nhận đường dẫn tệp tạm thời, ví dụ `/tmp/workerman.upload.SRliMu`
}
return response('ok');
}
}
Lưu ý:
- Tệp sau khi được tải lên sẽ được đặt tên là một tệp tạm, giống như
/tmp/workerman.upload.SRliMu
- Kích thước tệp tải lên bị giới hạn bởi defaultMaxPackageSize, mặc định là 10M, có thể thay đổi giá trị mặc định trong tệp
config/server.php
thông quamax_package_size
. - Tệp tạm sẽ được tự động xóa sau khi kết thúc yêu cầu
- Nếu yêu cầu không có tệp tải lên thì
$request->file()
sẽ trả về một mảng rỗng - Tệp được tải lên không hỗ trợ phương thức
move_uploaded_file()
, hãy sử dụng phương thức$file->move()
thay thế, tham khảo ví dụ bên dưới
Nhận tệp tải lên cụ thể
$request->file('avatar');
Nếu tệp tồn tại thì sẽ trả về instance webman\Http\UploadFile
tương ứng, nếu không sẽ trả về null.
Ví dụ
<?php
namespace app\controller;
use support\Request;
class UploadController
{
public function file(Request $request)
{
$file = $request->file('avatar');
if ($file && $file->isValid()) {
$file->move(public_path().'/files/myfile.'.$file->getUploadExtension());
return json(['code' => 0, 'msg' => 'upload success']);
}
return json(['code' => 1, 'msg' => 'file not found']);
}
}
Nhận host
Nhận thông tin host của yêu cầu.
$request->host();
Nếu địa chỉ yêu cầu không phải là cổng tiêu chuẩn 80 hoặc 443, thông tin host có thể có cổng, ví dụ example.com:8080
. Nếu không cần cổng thì tham số đầu tiên có thể truyền vào true
.
$request->host(true);
Nhận phương thức yêu cầu
$request->method();
Giá trị trả về có thể là một trong các giá trị GET
、POST
、PUT
、DELETE
、OPTIONS
、HEAD
.
Nhận uri yêu cầu
$request->uri();
Trả về uri của yêu cầu, bao gồm phần path và queryString.
Nhận đường dẫn yêu cầu
$request->path();
Trả về phần đường dẫn của yêu cầu.
Nhận queryString yêu cầu
$request->queryString();
Trả về phần queryString của yêu cầu.
Nhận url yêu cầu
Phương thức url()
trả về URL không có tham số Query
.
$request->url();
Trả về giống như //www.workerman.net/workerman-chat
Phương thức fullUrl()
trả về URL có tham số Query
.
$request->fullUrl();
Trả về giống như //www.workerman.net/workerman-chat?type=download
Lưu ý
url()
vàfullUrl()
không trả về phần giao thức (không trả về http hoặc https).
Bởi vì trong trình duyệt, địa chỉ bắt đầu bằng//example.com
sẽ tự động nhận dạng giao thức của trang hiện tại và tự động gửi yêu cầu bằng http hoặc https.
Nếu bạn sử dụng nginx làm proxy, hãy thêm proxy_set_header X-Forwarded-Proto $scheme;
vào cấu hình nginx, tham khảo nginx proxy,
vậy là bạn có thể sử dụng $request->header('x-forwarded-proto');
để xác định là http hay https, ví dụ:
echo $request->header('x-forwarded-proto'); // Xuất ra http hoặc https
Nhận phiên bản HTTP của yêu cầu
$request->protocolVersion();
Trả về chuỗi 1.1
hoặc 1.0
.
Nhận sessionId của yêu cầu
$request->sessionId();
Trả về chuỗi, được tạo thành từ chữ cái và số
Nhận IP của khách hàng yêu cầu
$request->getRemoteIp();
Nhận cổng của khách hàng yêu cầu
$request->getRemotePort();
Nhận IP thực của khách hàng yêu cầu
$request->getRealIp($safe_mode=true);
Khi dự án sử dụng proxy (ví dụ nginx), việc sử dụng $request->getRemoteIp()
thường sẽ nhận được IP của máy chủ proxy (như 127.0.0.1
192.168.x.x
) thay vì IP thực của khách hàng. Lúc này bạn có thể thử sử dụng $request->getRealIp()
để lấy IP thực của khách hàng.
$request->getRealIp()
sẽ cố gắng lấy IP thực từ các trường HTTP như x-forwarded-for
、x-real-ip
、client-ip
、x-client-ip
、via
.
Do các trường HTTP dễ bị giả mạo, nên IP của khách hàng nhận được bằng phương pháp này không phải là 100% đáng tin cậy, đặc biệt là khi
$safe_mode
là false. Cách đáng tin cậy hơn để lấy IP thực của khách hàng qua proxy là xác định rõ các IP máy chủ proxy an toàn, và xác định rõ trường HTTP nào mang theo IP thực, nếu IP được trả về bởi$request->getRemoteIp()
đã xác định là IP của máy chủ proxy an toàn đã biết, sau đó sử dụng$request->header('trường HTTP mang theo IP thực')
để lấy IP thực.
Nhận IP của máy chủ
$request->getLocalIp();
Nhận cổng của máy chủ
$request->getLocalPort();
Kiểm tra xem có phải là yêu cầu ajax không
$request->isAjax();
Kiểm tra xem có phải là yêu cầu pjax không
$request->isPjax();
Kiểm tra xem có yêu cầu trả về json không
$request->expectsJson();
Kiểm tra xem khách hàng có chấp nhận trả về json không
$request->acceptJson();
Nhận tên plugin của yêu cầu
Yêu cầu không phải từ plugin sẽ trả về chuỗi rỗng ''
.
$request->plugin;
Nhận tên ứng dụng của yêu cầu
Trong trường hợp một ứng dụng, lúc nào cũng trả về chuỗi rỗng ''
, nhiều ứng dụng sẽ trả về tên ứng dụng
$request->app;
Vì các hàm đóng không thuộc về bất kỳ ứng dụng nào, nên yêu cầu đến từ route đóng
$request->app
luôn trả về chuỗi rỗng''
Tham khảo route đóng route
Nhận tên lớp bộ điều khiển của yêu cầu
Nhận tên lớp tương ứng với bộ điều khiển
$request->controller;
Trả về giống như app\controller\IndexController
Vì các hàm đóng không thuộc về bất kỳ bộ điều khiển nào nên yêu cầu đến từ route đóng
$request->controller
luôn trả về chuỗi rỗng''
Tham khảo route đóng route
Nhận tên phương thức của yêu cầu
Nhận tên phương thức của bộ điều khiển tương ứng với yêu cầu
$request->action;
Trả về giống như index
Vì các hàm đóng không thuộc về bất kỳ bộ điều khiển nào nên yêu cầu đến từ route đóng
$request->action
luôn trả về chuỗi rỗng''
Tham khảo route đóng route
Ghi đè tham số
Đôi khi chúng ta muốn ghi đè tham số của yêu cầu, ví dụ như lọc yêu cầu, sau đó gán lại cho đối tượng yêu cầu, lúc này chúng ta có thể sử dụng các phương thức setGet()
setPost()
setHeader()
.
Ghi đè tham số GET
$request->get(); // Giả sử nhận được ['name' => 'tom', 'age' => 18]
$request->setGet(['name' => 'tom']);
$request->get(); // Cuối cùng nhận được ['name' => 'tom']
Lưu ý
Như trong ví dụ,setGet()
là ghi đè tất cả tham số GET,setPost()
setHeader()
cũng có hành vi tương tự.
Ghi đè tham số POST
$post = $request->post();
foreach ($post as $key => $value) {
$post[$key] = htmlspecialchars($value);
}
$request->setPost($post);
$request->post(); // Nhận tham số post đã được lọc
Ghi đè tham số HEADER
$request->setHeader(['host' => 'example.com']);
$request->header('host'); // Xuất ra example.com