মন্তব্য

অনুরোধ অবজেক্ট পান করা

webman স্বয়ংক্রিয়ভাবে action মেথডের প্রথম প্যারামিটারে অনুরোধ অবজেক্ট ইনজেক্ট করবে, যেমন

উদাহরণ

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        $default_name = 'webman';
        // get অনুরোধ থেকে name প্যারামিটারটি পেতে, যদি 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();

এই ফিচারটি php-fpm এর file_get_contents("php://input"); অপারেশনের অনুরূপ। HTTP মূল অনুরোধ প্যাকেজ পাওয়ার জন্য ব্যবহৃত হয়। এটি 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()); // আপলোড করা ফাইলের MIME টাইপ, যেমন '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 দ্বারা সীমাবদ্ধ, ডিফল্ট 10M, এটি 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();

যার ফলস্বরূপ হতে পারে GETPOSTPUTDELETEOPTIONSHEAD এর মধ্যে একটি।

অনুরোধ URI পান করা

$request->uri();

অনুরোধের URI ফেরত দেবে, যেটিতে path এবং queryString অংশ অন্তর্ভুক্ত।

অনুরোধের পথ পান করা

$request->path();

অনুরোধের path অংশ ফেরত দেবে।

অনুরোধের queryString পান করা

$request->queryString();

অনুরোধের queryString অংশ ফেরত দেবে।

অনুরোধের URL পান করা

url() মেথডের মাধ্যমে কোনও Query প্যারামিটার ছাড়াই URL ফেরত দেওয়া হয়।

$request->url();

ফলস্বরূপ হবে //www.workerman.net/workerman-chat

fullUrl() মেথডের মাধ্যমে Query প্যারামিটার সহ URL ফেরত দেওয়া হয়।

$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() HTTP হেডার থেকে x-forwarded-forx-real-ipclient-ipx-client-ipvia ফিল্ডগুলি থেকে বাস্তব IP পাওয়ার চেষ্টা করবে।

HTTP হেডারগুলি সহজে জাল করা যায়, তাই ক্লায়েন্ট IP পাওয়া 100% বিশ্বাসযোগ্য নয়, বিশেষ করে $safe_mode false হলে। প্রক্সির মাধ্যমে ক্লায়েন্টের বাস্তব IP পাওয়ার অপেক্ষাকৃত বিশ্বাসযোগ্য উপায় হল, পরিচিত নিরাপদ প্রক্সি সার্ভারের IP এবং বিষয়টি পরিষ্কারভাবে জানতে হবে যে কোন HTTP হেডারটি বাস্তব IP বহন করছে। যদি $request->getRemoteIp() পাওয়া IP পরিচিত নিরাপদ প্রক্সি সার্ভারের পূর্বনির্ধারিত হয়, তবে $request->header('বহনকারী বাস্তব IP HTTP হেডার') ব্যবহার করে বাস্তব IP পাওয়া সম্ভব।

সার্ভারের IP পান করা

$request->getLocalIp();

সার্ভারের পোর্ট পান করা

$request->getLocalPort();

AJAX অনুরোধ কিনা বোঝা

$request->isAjax();

PJAX অনুরোধ কিনা বোঝা

$request->isPjax();

JSON রিটার্ন প্রত্যাশা কিনা বোঝা

$request->expectsJson();

ক্লায়েন্ট JSON রিটার্ন গ্রহণ করে কিনা বোঝা

$request->acceptJson();

অনুরোধের প্লাগিন নাম পান করা

অপ্লাগিন অনুরোধে খালি স্ট্রিং '' ফেরত দেবে।

$request->plugin;

অনুরোধের অ্যাপ্লিকেশন নাম পান করা

একক অ্যাপ্লিকেশনে সর্বদা খালি স্ট্রিং '' ফেরত দেবে, বহু অ্যাপ্লিকেশন এর সময় অ্যাপ্লিকেশন নাম ফেরত দেবে।

$request->app;

কারণ ক্লোজার ফাংশন কোন অ্যাপ্লিকেশনের অন্তর্গত নয়, তাই ক্লোজার রাউট থেকে আগত অনুরোধের $request->app সর্বদা খালি স্ট্রিং '' ফেরত দেবে।
ক্লোজার রাউট সম্পর্কিত রাউট দেখুন।

অনুরোধের কন্ট্রোলার ক্লাস নাম পান করা

কন্ট্রোলারের সংশ্লিষ্ট ক্লাস নাম পান করা।

$request->controller;

ফলস্বরূপ হবে app\controller\IndexController এর মতো।

কারণ ক্লোজার ফাংশন কোন কন্ট্রোলারের অন্তর্গত নয়, তাই ক্লোজার রাউট থেকে আগত অনুরোধের $request->controller সর্বদা খালি স্ট্রিং '' ফেরত দেবে।
ক্লোজার রাউট সম্পর্কিত রাউট দেখুন।

অনুরোধের মেথড নাম পান করা

কন্ট্রোলারের সংশ্লিষ্ট মেথড নাম পান করা।

$request->action;

ফলস্বরূপ হবে index এর মতো।

কারণ ক্লোজার ফাংশন কোন কন্ট্রোলারের অন্তর্গত নয়, তাই ক্লোজার রাউট থেকে আগত অনুরোধের $request->action সর্বদা খালি স্ট্রিং '' ফেরত দেবে।
ক্লোজার রাউট সম্পর্কিত রাউট দেখুন।

প্যারামিটার পুনরায় লেখার জন্য

কখনো কখনো আমরা অনুরোধের প্যারামিটারগুলি পুনরায় লেখার প্রয়োজন পড়ে, যেমন অনুরোধকে ফিল্টার করতে এবং পরে অনুরোধ অবজেক্টে নতুন মান অ্যাসাইন করতে, এ সময় আমরা 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(); // ফিল্টার করা পোস্ট প্যারামিটার পাবেন

HEADER প্যারামিটার পুনরায় লেখা

$request->setHeader(['host' => 'example.com']);
$request->header('host'); // আউটপুট example.com