توضيح
الحصول على كائن الطلب
ستقوم webman تلقائيًا بإدخال كائن الطلب في أول معلمة لطريقة action، على سبيل المثال
مثال
<?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');
دالة المساعد input()
تشبه وظيفة $request->input()
، يمكنها الحصول على جميع المعلمات، تحتوي دالة المساعد 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
. تُستخدم للحصول على جسم الطلب الأصلي HTTP. هذا مفيد عند الحصول على بيانات POST غير بتنسيق application/x-www-form-urlencoded
.
الحصول على الرؤوس
الحصول على مجموعة الرؤوس كاملة
$request->header();
إذا لم يكن هناك معلمات رأس في الطلب، فسترجع مصفوفة فارغة. لاحظ أن جميع المفاتيح صغيرة.
الحصول على قيمة معينة من مجموعة الرؤوس
$request->header('host');
إذا لم تحتوي مجموعة الرؤوس على هذه القيمة، فسترجع null. لاحظ أن جميع المفاتيح صغيرة.
مثل دالة get، يمكنك أيضًا تمرير قيمة افتراضية كوسيط ثانٍ لدالة header، إذا لم يتم العثور على القيمة المقابلة في مجموعة الرؤوس، فسترجع القيمة الافتراضية. على سبيل المثال:
$request->header('host', 'localhost');
الحصول على الكوكيز
الحصول على مجموعة الكوكيز كاملة
$request->cookie();
إذا لم يكن هناك معلمات كوكيز في الطلب، فسترجع مصفوفة فارغة.
الحصول على قيمة معينة من مجموعة الكوكيز
$request->cookie('name');
إذا لم تحتوي مجموعة الكوكيز على هذه القيمة، فسترجع null.
مثل دالة get، يمكنك أيضًا تمرير قيمة افتراضية كوسيط ثانٍ لدالة cookie، إذا لم يتم العثور على القيمة المقابلة في مجموعة الكوكيز، فسترجع القيمة الافتراضية. على سبيل المثال:
$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()); // نوع الملف المرفوع، مثل '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 ميغابايت، يمكنك تعديله في ملف
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']);
}
}
الحصول على المضيف
الحصول على معلومات المضيف للطلب.
$request->host();
إذا كانت عنوان الطلب على منفذ غير قياسي، مثل 80 أو 443، قد تحمل معلومات المضيف رقم المنفذ، مثل example.com:8080
. إذا لم يكن رقم المنفذ مطلوبًا، يمكن تمرير المعامل الأول كقيمة true
.
$request->host(true);
الحصول على طريقة الطلب
$request->method();
قد تكون القيمة المرتجعة إما GET
، POST
، PUT
، DELETE
، OPTIONS
، HEAD
.
الحصول على URI الطلب
$request->uri();
ترجع URI الطلب، بما في ذلك جزء المسار و queryString.
الحصول على مسار الطلب
$request->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()
لا تعيد جزء البروتوكول (لا تعيد http أو https).
لأن المتصفحات تستخدم عناوين تبدأ بـ//example.com
ستتعرف تلقائيًا على البروتوكول الحالي للموقع، وستبدأ الطلب تلقائيًا باستخدام http أو https.
إذا كنت تستخدم وكيل nginx، يرجى إضافة proxy_set_header X-Forwarded-Proto $scheme;
إلى تكوين nginx، ارجع إلى وكيل nginx،
ثم يمكنك استخدام $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 للعميل للطلب
$request->getRemoteIp();
الحصول على منفذ العميل للطلب
$request->getRemotePort();
الحصول على عنوان IP الحقيقي للعميل
$request->getRealIp($safe_mode=true);
عندما تستخدم مشروع وكيل (مثل nginx)، فإن استخدام $request->getRemoteIp()
غالبًا ما يعود بعنوان IP لخادم الوكيل (مثل 127.0.0.1
أو 192.168.x.x
) وليس عنوان IP الحقيقي للعميل. في هذه الحالة، يمكنك محاولة استخدام $request->getRealIp()
للحصول على عنوان IP الحقيقي للعميل.
سوف يحاول $request->getRealIp()
الحصول على عنوان IP الحقيقي من رؤوس HTTP x-forwarded-for
، x-real-ip
، client-ip
، x-client-ip
، وvia
.
نظرًا لأن رؤوس HTTP من السهل تزويرها، فإن عنوان IP للعميل الذي يتم الحصول عليه بهذه الطريقة ليس 100% موثوقًا، خاصةً عندما يكون
$safe_mode
false. الطريقة الأكثر موثوقية للحصول على عنوان IP الحقيقي للعميل من خلال الوكيل هي معروفة IP لخادم الوكيل الآمن، ومعرفة بالتحديد أي رأس HTTP يحمل عنوان IP الحقيقي. إذا كان عنوان IP الذي تم استرجاعه بواسطة$request->getRemoteIp()
هو تأكيد لـ IP لخادم الوكيل المعروف، بعد ذلك، استخدم$request->header('HTTP رأس الذي يحمل عنوان IP الحقيقي')
للحصول على عنوان IP الحقيقي.
الحصول على عنوان IP للخادم
$request->getLocalIp();
الحصول على منفذ الخادم
$request->getLocalPort();
التحقق مما إذا كان الطلب هو Ajax
$request->isAjax();
التحقق مما إذا كان الطلب هو Pjax
$request->isPjax();
التحقق مما إذا كان يتوقع استجابة JSON
$request->expectsJson();
التحقق مما إذا كان العميل يقبل استجابة JSON
$request->acceptJson();
الحصول على اسم الإضافة المطلوبة
ترجع قيمة فارغة ''
في حالة الطلب غير الإضافي.
$request->plugin;
الحصول على اسم التطبيق المطلوب
ترجع قيمة فارغة ''
في حالة التطبيق الأحادي، تضمن قيم مختلفة في حالة التطبيقات المتعددة
$request->app;
لأن الدوال اللغوية لا تنتمي إلى أي تطبيق، فإن الطلبات القادمة من مسارات الوظائف اللغوية ترجع دائمًا قيمة فارغة
''
راجع المسارات Route
الحصول على اسم فئة وحدة التحكم المطلوبة
الحصول على اسم الفئة المرتبطة بوحدة التحكم
$request->controller;
ترجع قيمة مشابهة لـ app\controller\IndexController
لأن الدوال اللغوية لا تنتمي إلى أي وحدة التحكم، فإن الطلبات القادمة من مسارات الوظائف اللغوية ترجع دائمًا قيمة فارغة
''
راجع المسارات Route
الحصول على اسم الطريقة المطلوبة
الحصول على اسم الطريقة الخاصة بوحدة التحكم المطلوبة
$request->action;
ترجع قيمة مشابهة لـ index
لأن الدوال اللغوية لا تنتمي إلى أي وحدة التحكم، فإن الطلبات القادمة من مسارات الوظائف اللغوية ترجع دائمًا قيمة فارغة
''
راجع المسارات Route
إعادة كتابة المعلمات
أحيانًا نريد إعادة كتابة معلمات الطلب، على سبيل المثال، تصفية الطلب ثم إعادة تعيين القيم في كائن الطلب، في هذه الحالة، يمكننا استخدام طرق 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'); // يخرج example.com