توضيح

الحصول على كائن الطلب

ستقوم 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() على معاملتين:

  1. name: اسم المعلمة المراد الحصول عليها (يمكن الحصول على مصفوفة جميع المعلمات إذا كانت فارغة)
  2. 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