คำอธิบาย
รับอ็อบเจ็กต์ขอคำขอ
webman จะแทรขอคำขอโดยอัตโนมัติไปยังพารามิเตอร์แรกของเมธอดแอ็กชัน เช่น
ตัวอย่าง
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
$default_name = 'webman';
// รับพารามิเตอร์ name จากคำขอ get และถ้าไม่มีการระบุพารามิเตอร์ name จะคืนค่าเป็น $default_name
$name = $request->get('name', $default_name);
// ส่งข้อความกลับไปยังเบราว์เซอร์
return response('hello ' . $name);
}
}
ผ่านอ็อบเจ็กต์ $request เราสามารถรับข้อมูลขอคำขอที่เกี่ยวข้องได้
บางครั้งเราอาจต้องการรับอ็อบเจ็กต์ $request ของคำขอปัจจุบันจากคลาสอื่น ๆ ในกรณีนี้เราสามารถใช้ฟังก์ชันตัวช่วย request() ได้
รับพารามิเตอร์ของคำขอ get
รับอาร์เรย์ทั้งหมดของ get
$request->get();
หากคำขอไม่มีพารามิเตอร์ get จะคืนค่าเป็นอาร์เรย์ที่ว่างเปล่า
รับค่าของอาร์เรย์ get
$request->get('name');
หากอาร์เรย์ get ไม่มีค่านี้จะคืนค่าเป็น null
คุณยังสามารถส่งพารามิเตอร์ตัวสองให้กับเมธอด get หากอาร์เรย์ get ไม่พบค่าที่สอดคล้องกันจะคืนค่าตัวที่เป็นค่าเริ่มต้น เช่น
$request->get('name', 'tom');
รับพารามิเตอร์ของคำขอ post
รับอาร์เรย์ทั้งหมดของ post
$request->post();
หากคำขอไม่มีพารามิเตอร์ post จะคืนค่าเป็นอาร์เรย์ที่ว่างเปล่า
รับค่าของอาร์เรย์ post
$request->post('name');
หากอาร์เรย์ post ไม่มีค่านี้จะคืนค่าเป็น null
เหมือนกับเมธอด get คุณยังสามารถส่งพารามิเตอร์ตัวสองให้กับเมธอด post หากอาร์เรย์ post ไม่พบค่าที่สอดคล้องกันจะคืนค่าตัวที่เป็นค่าเริ่มต้น เช่น
$request->post('name', 'tom');
ฟังก์ชัน helper input()
คล้ายกับ $request->input() ฟังก์ชัน helper input() สามารถรับพารามิเตอร์ทั้งหมดได้ มีสองพารามิเตอร์:
- name: ชื่อพารามิเตอร์ที่ต้องการรับ (ถ้าว่าง จะได้รับอาร์เรย์ของพารามิเตอร์ทั้งหมด)
- default: ค่าเริ่มต้น (ใช้เมื่อไม่พบพารามิเตอร์จากอาร์กิวเมนต์แรก)
ตัวอย่าง
// รับพารามิเตอร์ name
$name = input('name');
// รับพารามิเตอร์ name หากไม่มีให้ใช้ค่าเริ่มต้น
$name = input('name', 'สมชาย');
// รับพารามิเตอร์ทั้งหมด
$all_params = input();
รับพารามิเตอร์ post ต้นฉบับ
$post = $request->rawBody();
ฟังก์ชันนี้เหมือนกับการกระทำ file_get_contents("php://input"); ใน php-fpm สำหรับการรับข้อมูลคำขอ post รูปแบบอีกแบบที่ไม่ใช่ application/x-www-form-urlencoded มีประโยชน์มาก
รับเฮดเดอร์
รับอาร์เรย์ทั้งหมดของเฮดเดอร์
$request->header();
หากคำขอไม่มีพารามิเตอร์เฮดเดอร์ จะคืนค่าเป็นอาร์เรย์ที่ว่างเปล่า โปรดทราบว่าคีย์ทั้งหมดเป็นตัวพิมพ์เล็ก
รับค่าของอาร์เรย์เฮดเดอร์
$request->header('host');
หากอาร์เรย์เฮดเดอร์ไม่มีค่านี้จะคืนค่าเป็น null โปรดทราบว่าคีย์ทั้งหมดเป็นตัวพิมพ์เล็ก
เหมือนกับเมธอด get คุณยังสามารถส่งพารามิเตอร์ตัวสองให้กับเมธอดเฮดเดอร์ หากอาร์เรย์เฮดเดอร์ไม่พบค่าที่สอดคล้องกันจะคืนค่าตัวที่เป็นค่าเริ่มต้น เช่น
$request->header('host', 'localhost');
รับคุกกี้
รับอาร์เรย์ทั้งหมดของคุกกี้
$request->cookie();
หากคำขอไม่มีพารามิเตอร์คุกกี้ จะคืนค่าเป็นอาร์เรย์ที่ว่างเปล่า
รับค่าของอาร์เรย์คุกกี้
$request->cookie('name');
หากอาร์เรย์คุกกี้ไม่มีค่านี้จะคืนค่าเป็น null
เหมือนกับเมธอด get คุณยังสามารถส่งพารามิเตอร์ตัวสองให้กับเมธอดคุกกี้ หากอาร์เรย์คุกกี้ไม่พบค่าที่สอดคล้องกันจะคืนค่าตัวที่เป็นค่าเริ่มต้น เช่น
$request->cookie('name', 'tom');
รับข้อมูลทั้งหมด
ประกอบด้วยข้อมูลจาก post get ทั้งหมด
$request->all();
รับค่าที่ระบุ
รับค่าจาก post get ทั้งหมด
$request->input('name', $default_value);
รับข้อมูลบางส่วน
รับข้อมูลบางส่วนจาก post get
// รับอาร์เรย์ที่เป็นผลลัพธ์จากการระบุคีย์ username และ password ซึ่งจะถูกถ้าไม่มีคีย์ที่ถูกระบุ
$only = $request->only(['username', 'password']);
// รับข้อมูลทั้งหมดนอกเหนือจาก avatar และ age
$except = $request->except(['avatar', 'age']);
รับข้อมูลผ่านพารามิเตอร์คอนโทรลเลอร์
<?php
namespace app\controller;
use support\Response;
class UserController
{
public function create(string $name, int $age = 18): Response
{
return json(['name' => $name, 'age' => $age]);
}
}
โค้ดด้านบนเทียบเท่ากับ:
<?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]);
}
}
ดูข้อมูลเพิ่มเติมได้ที่ การผูกพารามิเตอร์คอนโทรลเลอร์
รับไฟล์ที่อัพโหลด
หมายเหตุ
การอัพโหลดไฟล์ต้องใช้ฟอร์มรูปแบบmultipart/form-data
รับอาร์เรย์ทั้งหมดของไฟล์ที่อัพโหลด
$request->file();
ตัวอย่างฟอร์ม:
<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>
$request->file() จะคืนค่าในรูปแบบเดียวกับ:
array (
'file1' => object(webman\Http\UploadFile),
'file2' => object(webman\Http\UploadFile)
)
เป็นอาร์เรย์ของอินสแตนท์ webman\Http\UploadFile โดย webman\Http\UploadFile คือคลาสจาก PHP ที่มีอยู่อย่างใน SplFileInfo และให้เมทอดอินสแตนท์
<?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()); // ได้หรือไม่ได้รับไฟล์ ตัวอย่างเช่น true|false
var_export($spl_file->getUploadExtension()); // ได้นามสกุลไฟล์ที่อัพโหลด เช่น 'jpg'
var_export($spl_file->getUploadMimeType()); // ได้ชนิด mine ของไฟล์ที่อัพโหลด เช่น 'image/jpeg'
var_export($spl_file->getUploadErrorCode()); // ได้รหัสข้อผิดพลาดการอัพโหลด เช่น UPLOAD_ERR_NO_TMP_DIR UPLOAD_ERR_NO_FILE UPLOAD_ERR_CANT_WRITE
var_export($spl_file->getUploadName()); // ได้ชื่อไฟล์ที่อัพโหลด เช่น 'my-test.jpg'
var_export($spl_file->getSize()); // ได้ขนาดของไฟล์ เช่น 13364 หน่วยเป็นไบต์
var_export($spl_file->getPath()); // ได้ตำแหน่งที่อัพโหลด เช่น '/tmp'
var_export($spl_file->getRealPath()); // ได้เส้นทางไฟล์ชั่วคราว เช่น `/tmp/workerman.upload.SRliMu`
}
return response('ok');
}
}
โปรดทราบ:
- ไฟล์ที่อัพโหลดจะถูกตั้งชื่อเป็นไฟล์ชั่วคราว เช่น
/tmp/workerman.upload.SRliMu - ขนาดของไฟล์ที่ได้อัพโหลดได้จะถูก จำกัด โดยการกำหนดขนาดเริ่มต้นที่ defaultMaxPackageSize เป็น 10 M โดยปริยาย สามารถเปลี่ยนแปลงค่าเริ่มต้นได้ในไฟล์
config/server.phpโดยการเปลี่ยนแปลงmax_package_size - ไฟล์ชั่วคราวจะถูกลบโดยอัตโนมัติหลังจากคำขอสิ้นสุด
- หากคำขอไม่มีการอัพโหลดไฟล์
$request->file()จะคืนค่าเป็นอาร์เรย์ที่ว่างเปล่า - ไม่รองรับการใช้งาน
move_uploaded_file()สำหรับไฟล์ที่อัพโหลด โปรดใช้เมทอด$file->move()ตามตัวอย่างด้านล่าง
รับไฟล์ที่อัพโหลด
$request->file('avatar');
หากไฟล์มีค่าจะคืนค่าเป็นอินสแตนส์ webman\Http\UploadFile ที่สอดคล้อง มิเช่นนั้นจะคืนค่าเป็น null
ตัวอย่าง
<?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']);
}
}
รับ host
รับข้อมูล host ของการร้องขอ
$request->host();
หากที่ร้องขอมาไม่ใช่พอร์ตมาตรฐาน 80 หรือ 443 ข้อมูล host อาจจะมีพอร์ตเช่น example.com:8080 ถ้าไม่ต้องการรวมพอร์ต สามารถใส่พารามิเตอร์ตัวแรกเป็น true
$request->host(true);
รับวิธีการร้องขอ
$request->method();
คืนค่าอาจเป็น GET, POST, PUT, DELETE, OPTIONS, หรือ HEAD หนึ่งวิธีการ
รับ URI ของการร้องขอ
$request->uri();
คืนค่า URI ของการร้องขอ รวมถึง path และส่วน queryString
รับเส้นทางของการร้องขอ
$request->path();
คืนเส้นทาง (path) ของการร้องขอ
รับ queryString ของการร้องขอ
$request->queryString();
คืนค่า queryString ของการร้องขอ
รับ URL ของการร้องขอ
เมธอด url() คืนค่า URL โดยไม่รวมพารามิเตอร์ Query
$request->url();
คืนค่าเช่น //www.workerman.net/workerman-chat
เมธอด fullUrl() คืนค่า URL รวมพารามิเตอร์ Query
$request->fullUrl();
คืนค่าเช่น //www.workerman.net/workerman-chat?type=download
โปรดทราบ
url()และfullUrl()ไม่คืนค่าส่วนโปรโตคอล (protocol) (ไม่คืนค่า http หรือ https) เนื่องจากในเบราว์เซอร์เมื่อใช้ที่อยู่ที่ขึ้นต้นด้วย//จะตรวจจับโปรโตคอลของเว็บไซต์ปัจจุบันโดยอัตโนมัติ และทำการส่งคำร้องขอโดยใช้ http หรือ https
หากคุณใช้ nginx proxy โปรดเพิ่ม proxy_set_header X-Forwarded-Proto $scheme; ลงในการกำหนด nginx ดูเพิ่มเติมที่ nginx proxy นี้ ทำให้สามารถทำการใช้ $request->header('x-forwarded-proto'); เพื่อตรวจสอบว่าเป็น http หรือ https เช่น
echo $request->header('x-forwarded-proto'); // แสดงผล http หรือ https
รับเวอร์ชัน HTTP ของการร้องขอ
$request->protocolVersion();
คืนค่าสตริง 1.1 หรือ 1.0
รับ sessionId ของการร้องขอ
$request->sessionId();
คืนค่าสตริงที่ประกอบด้วยตัวอักษรและตัวเลข
รับ IP ของกลุ่มผู้ใช้งาน (Client)
$request->getRemoteIp();
รับพอร์ตของกลุ่มผู้ใช้งาน (Client)
$request->getRemotePort();
รับ IP ของกลุ่มผู้ใช้งาน (Client) จริง
$request->getRealIp($safe_mode=true);
เมื่อโปรเจกต์ใช้พร็อกซี(เช่น nginx) การใช้ $request->getRemoteIp() มักจะได้รับ IP ของเซิร์ฟเวอร์พร็อกซี (เช่น 127.0.0.1 192.168.x.x) แทน IP จริงของกลุ่มผู้ใช้งาน (Client) ในกรณีนี้ คุณสามารถลองใช้ $request->getRealIp() เพื่อรับ IP จริงของกลุ่มผู้ใช้งาน (Client)
$request->getRealIp() จะพยายามรับ IP จริงจากฟิลด์ x-forwarded-for, x-real-ip, client-ip, x-client-ip, via ใน HTTP header
เนื่องจากเฮดเดร์ HTTP สามารถปลอมแปลงได้ง่าย ดังนั้นวิธีนี้ในการรับ IP จริงของกลุ่มผู้ใช้งานจึงไม่สามารถเชื่อถือได้ โดยเฉพาะถ้า
$safe_modeเป็นเท็จ วิธีที่ที่ที่เป็นการนำเข้า IP ผู้ใช้จริงโดยอาจหลือกคือทราย IP ของเซิร์ฟเวอร์พร็อกซีที่มีความปลอดภัยทราบอันดับและมุ่นนร้ายโดยรู้จัก [การใช้งาน $request->getRemoteIp()และอาจารย์ความปลอดภัย) หาก IP ที่คืนใช้งาน $request->getRemoteIp()ยืนยันว่าเป็นเซิร์ฟเวอร์พร็อกซีที่ทราบอันดับและมุ่นนร้ายหลังจากนั้นโดยใช้$request->header('โครงข่ากราง IP ที่จะนำเข้า')รับ IP จริง
รับ IP ของเซิร์ฟเวอร์
$request->getLocalIp();
รับพอร์ตของเซิร์ฟเวอร์
$request->getLocalPort();
ตรวจสอบว่าเป็นการร้องขอแบบ AJAX หรือไม่
$request->isAjax();
ตรวจสอบว่าเป็นการร้องขอแบบ PJAX หรือไม่
$request->isPjax();
ตรวจสอบว่าการร้องขอคาดหวังการคืนค่าในรูปแบบ JSON หรือไม่
$request->expectsJson();
ตรวจสอบว่าไคลเอ็นต์ได้รับการคืนค่าเป็น JSON หรือไม่
$request->acceptJson();
รับชื่อปลั๊กอินของการร้องขอ
การร้องขอที่ไม่ใช่แบบปลั๊กอินจะคืนค่าสตริงว่าง ''
$request->plugin;
รับชื่อแอพพลิเคชันของการร้องขอ
เมื่อมีแอพพลิเคชันเดียวเสมอคืนค่าสตริงว่าง
เมื่อมี แอพพลิเคชันเยอะ คืนกลับชื่อของแอพพลิเคชัน
$request->app;
เนื่องจากฟังก์ชันปิดไม่ได้อยู่ภายใต้แอพพลิเคชันใด ๆ การร้องขอจากเส้นทางปิดในฟังก์ชันปิดคืนค่าสตริงว่าง
ดูเพิ่มเติมที่ เส้นทาง
รับชื่อคลาสควบคิลของการร้องขอ
รับชื่อคลาสควบคิลที่สอดคลีกัน
$request->controller;
คืนค่าเช่น app\controller\IndexController
เนื่องจากฟังก์ชันปิดไม่ได้อยู่ภายใต้คลาสควบคิลใด ๆ การร้องขอจากเส้นทางปิดในคลาสควบคิลคืนค่าสตริงว่าง
ดูเพิ่มเติมที่ เส้นทาง
รับชื่อเมธอดที่าร้องขอ
รับชื่อเมธอดที่สอดคลีกันของควบคิล
$request->action;
คืนค่าเช่น index
เนื่องจากฟังก์ชันปิดไม่ได้อยู่ภายใต้คลาสควบคิลใด ๆ การร้องขอจากเส้นทางปิดในคลาสควบคิลคืนค่าสตริงว่าง
ดูเพิ่มเติมที่ เส้นทาง
ทับพารามิเตอร์
บางครั้งเราต้องการทับพารามิเตอร์ของการร้องขอ เช่น กรองการร้องขอแล้วกำหนดค่าใหม่ให้กับออบเจ็กต์การร้องขอ ในกรณีนี้เราสามารถใช้เมธอด setGet() setPost() setHeader() ได้
ทับพารามิเตอร์ GET
$request->get(); // สมมติได้ ['name' => 'tom', 'age' => 18]
$request->setGet(['name' => 'tom']);
$request->get(); // ผลลัพธ์สุดท้ายคือ ['name' => 'tom']
หมายเหตุ
ตามตัวอย่างsetGet()จะทับพารามิเตอร์ GET ทั้งหมดsetPost()setHeader()ก็ทำงานเหมือนกัน
ทับพารามิเตอร์ POST
$post = $request->post();
foreach ($post as $key => $value) {
$post[$key] = htmlspecialchars($value);
}
$request->setPost($post);
$request->post(); // ได้พารามิเตอร์ post ที่กรองแล้ว
ทับพารามิเตอร์ HEADER
$request->setHeader(['host' => 'example.com']);
$request->header('host'); // output: example.com