Laravel Framework Basics পর্ব-৭: Laravel Request

Laravel Request কি?

http request response
http request response

Laravel Framework এ সবধরণের Laravel Request গুলো Illuminate\Http\Request ক্লাসের মাধ্যমে আপনার অ্যাপ্লিকেশন দ্বারা পরিচালিত কারেন্ট HTTP request এর সাথে ইন্টারঅ্যাক্ট করার পাশাপাশি যেসব ইনপুট গুলো সাবমিট করা হয়েছে সেই ইনপুট গুলো , কুকিজ গুলো এবং ফাইলগুলি retrieve করার একটি object-oriented উপায় প্রদান করে।

Interacting With The Laravel Request

Accessing The Laravel Request

Laravel Framework কে current HTTP request গুলো ধরার জন্য আমরা dependency injection Illuminate\Http\Request এর এর একটি TypeHint ব্যবহার করব। এবং যেখানেই সেটা লারাভেল route অথবা controller যেকোনো রিকোয়েস্ট রিসিভ করার ব্যাপার থাকবে, সেখানেই আমরা প্রথমে সবার উপরে Illuminate\Http\Request এই নেমস্পেস একবার ব্যবহার করব। এবং যেই লারাভেল মেথডে আমরা রিকোয়েস্ট রিসিভ করব সেই মেথডে একটা TypeHint ব্যবহার করতে হবে। incoming Request এর Instance স্বয়ংক্রিয়ভাবে service container দ্বারা ইনজেকশন করা হবে:

<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
 
class UserController extends Controller
{
    /**
     * Store a new user.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $name = $request->input('name');
 
        //
    }
}

একইভাবে আপনি একটি Route closure এর ক্ষেত্রেও আপনি Illuminate\Http\Request ক্লাস এর type-hint দিতে হবে। একইভাবে এখানেও service container টি স্বয়ংক্রিয়ভাবে সব incoming request কে Route closure এ ইনজেক্ট করবে যখন এটি execute হবে:

use Illuminate\Http\Request;
 
Route::get('/', function (Request $request) {
    //
});

Mastering Laravel with ReactJS Course

Dependency Injection & Route Parameters

যদি আপনার controller method এ একটি route প্যারামিটার থেকে ইনপুট নেওয়ার প্রয়োজন হয়, তবে আপনার অন্যান্য dependencies গুলোর পরে আপনার route parameter গুলোর লিস্ট দিতে হবে । উদাহরণস্বরূপ, যদি আপনার route টি এভাবে ডিফাইন করা হয়:

use App\Http\Controllers\UserController;
 
Route::put('/user/{id}', [UserController::class, 'update']);

একইভাবে আপনি আপনার Controller ক্লাস এর Method এ Illuminate\Http\Request ক্লাস এর type-hint করতে হবে। ঠিক নিচের মতো :

<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
 
class UserController extends Controller
{
    /**
     * Update the specified user.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  string  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }
}

Request Path & Method

লারাভেল এর Illuminate\Http\Request instance ইনকামিং HTTP request গুলো পরীক্ষা করার জন্য বিভিন্ন method গুলো প্রদান করে , যা মূলতঃ Symfony\component\HttpFoundation\Request ক্লাস থেকে extends করা। আমরা নীচে কয়েকটি গুরুত্বপূর্ণ methods নিয়ে আলোচনা করব।

Retrieving The Request Path

Laravel Request Class এর path method টি বিভিন্ন ধরণের request গুলোর পাথের তথ্য প্রদান করে। সুতরাং, যদি incoming request টি http://localhost:8000/foo/bar এ টার্গেট করা হয়, তখন path method টি foo/bar ফেরত দেবে:

$uri = $request->path();

Inspecting The Request Path / Route

Laravel Request Class এর is Method এর মাধ্যমে incoming request গুলোকে একটি নির্দিষ্ট pattern কে ম্যাচিং করার সুযোগ দেয় । এর জন্য আপনি এই method টি ব্যবহার করার সময় আপনি একটি wildcard হিসাবে * অক্ষরটি ব্যবহার করতে পারেন:

if ($request->is('admin/*')) {
    //
}

আবার routeIs method টি ব্যবহার করে, আপনি নির্ধারণ করতে পারেন যে incoming request টি একটি named route এর সাথে মিলেছে কিনা:

if ($request->routeIs('admin.*')) {
    //
}

Retrieving The Request URL

incoming request গুলোর জন্য সম্পূর্ণ URL retrieve করতে আপনি url বা fullUrl method গুলি ব্যবহার করতে পারেন৷ url method টি query string ছাড়াই URL প্রদান করবে, যখন fullUrl method এ query string সহ URL টি দিবে:

$url = $request->url();
 
$urlWithQueryString = $request->fullUrl();

আপনি যদি বর্তমান URL-এ নতুন কোনো query string ডেটা যুক্ত করতে চান, তাহলে Laravel Request ক্লাস ব্যবহার করে আপনি fullUrlWithQuery এই method টি কল করতে পারেন। এই method টি বর্তমান query string এর সাথে নতুন query string ভেরিয়েবলের প্রদত্ত অ্যারেকে একত্রিত করে:

$request->fullUrlWithQuery(['type' => 'phone']);

Retrieving The Request Method

Laravel Request ক্লাস ব্যবহার করে আপনার incoming data গুলো কোন HTTP Method এর মাধ্যমে এসেছে তা চেক করার জন্য আপনি method () মেথড ব্যবহার করতে পারেন। আবার HTTP Method টি আপনার ইচ্ছা অনুযায়ী HTTP Method এ আসছে কিনা , তা যাচাই করার জন্য আপনি isMethod মেথড টি ব্যবহার করতে পারেন:

$method = $request->method();
 
if ($request->isMethod('post')) {
    //
}

Request Headers

Laravel Request ক্লাস এ আপনি header method টি ব্যবহার করে Illuminate\Http\Request ইনস্ট্যান্স থেকে একটি request header বের করতে পারেন। আর header request যদি না থাকলে, null ফেরত দেওয়া হবে। যাইহোক, header method টি একটি অতিরিক্ত দ্বিতীয় একটি আর্গুমেন্ট গ্রহণ করে যেটি return হবে যদি request header টি উপস্থিত না থাকে:

$value = $request->header('X-Header-Name');
 
$value = $request->header('X-Header-Name', 'default');

request টির মধ্যে একটি নির্দিষ্ট header রয়েছে কিনা তা নির্ধারণ করতে hasHeader method ব্যবহার করা যেতে পারে:

if ($request->hasHeader('X-Header-Name')) {
    //
}

সুবিধার জন্য, Authorization header থেকে bearer token বের করার জন্য আমরা bearerToken method টি ব্যবহার করতে পারি। যদি এই ধরনের কোনো header উপস্থিত না থাকে, তাহলে একটি empty string রিটার্ন করবে :

$token = $request->bearerToken();

Request IP Address

ip method টি ব্যবহার করে আমরা ক্লায়েন্টের আইপি এড্রেস বের করতে পারি , যেটি আপনার application এ request করেছে:

$ipAddress = $request->ip();

Content Negotiation

Laravel Request ক্লাস Accept header এর মাধ্যমে incoming request গুলোর request করা content type গুলো inspect করার জন্য বিভিন্ন method প্রদান করে। প্রথমে, getAcceptableContentTypes method টি request দ্বারা গৃহীত সমস্ত content types ধারণকারী একটি অ্যারে রিটার্ন দেবে:

$contentTypes = $request->getAcceptableContentTypes();

accepts মেথড content type গুলোর একটি array গ্রহণ করে এবং request এর মাধ্যমে যেকোনও একটি কন্টেন্ট টাইপ গ্রহন করা হলে তা true রিটার্ন করবে । অন্যথায়, false রিটার্ন করবে।

if ($request->accepts(['text/html', 'application/json'])) {
    // ...
}

HTTP Request এর মাধ্যমে প্রদত্ত content type গুলির মধ্যে কোন content type টি সবচেয়ে বেশি পছন্দ করা হয় তা নির্ধারণ করতে আপনি prefers method ব্যবহার করতে পারেন। যদি content type গুলোর কোনোটি request দ্বারা গৃহীত না হয়, তাহলে null রিটার্ন করা হবে:

$preferred = $request->prefers(['text/html', 'application/json']);

যেহেতু অনেক applications শুধুমাত্র HTML বা JSON পরিবেশন করে, তাই আপনি incoming request টি JSON response আশা করে কিনা তা দ্রুত নির্ধারণ করতে expectsJson method ব্যবহার করতে পারেন:

if ($request->expectsJson()) {
    // ...
}

PSR-7 Requests

PSR-7 standard requests এবং responses সহ HTTP message গুলির জন্য ইন্টারফেসগুলি নির্দিষ্ট করে৷ আপনি যদি Laravel request এর পরিবর্তে একটি PSR-7 request এর একটি instance পেতে চান তবে আপনাকে প্রথমে কয়েকটি লাইব্রেরি ইনস্টল করতে হবে। লারাভেল সাধারণত Laravel requests এবং responses গুলিকে PSR-7 সামঞ্জস্যপূর্ণ বাস্তবায়নে রূপান্তর করতে Symfony HTTP Message Bridge component ব্যবহার করে:

composer require symfony/psr-http-message-bridge
composer require nyholm/psr7

একবার আপনি এই লাইব্রেরিগুলি ইনস্টল করার পরে, আপনি আপনার route closure বা controller method এ request ইন্টারফেস type-hinting করে একটি PSR-7 request পেতে পারেন:

use Psr\Http\Message\ServerRequestInterface;
 
Route::get('/', function (ServerRequestInterface $request) {
    //
});

আপনি যদি একটি route বা controller থেকে একটি PSR-7 response instance রিটার্ন করেন, তাহলে এটি স্বয়ংক্রিয়ভাবে Laravel response instance এ রূপান্তরিত হবে এবং ফ্রেমওয়ার্ক দ্বারা প্রদর্শিত হবে।

Retrieving Input

Retrieving All Input Data

আপনি all method ব্যবহার করে একটি অ্যারে হিসাবে incoming request গুলোর input data ডেটা বের করতে পারেন। incoming request টি HTML form থেকে হোক বা একটি XHR request হোক না কেন আপনি এই method টি ব্যবহার করতে পারেন।

$input = $request->all();

collect method ব্যবহার করে, আপনি একটি collection হিসাবে incoming request গুলোর ইনপুট ডেটা বের করতে পারেন:

$input = $request->collect();

collect method টি আপনাকে collection হিসাবে incoming request input একটি subset বের করতে দেয়:

$request->collect('users')->each(function ($user) {
    // ...
});

Retrieving An Input Value

কয়েকটি simple method ব্যবহার করে, request জন্য কোন HTTP verb ব্যবহার করা হয়েছে তা নিয়ে চিন্তা না করে আপনি আপনার Illuminate\Http\Request instance থেকে সমস্ত user input অ্যাক্সেস করতে পারেন। HTTP verb নির্বিশেষে, user input বের করতে input method ব্যবহার করা যেতে পারে:

$name = $request->input('name');

আপনি input method টি তে second argument হিসাবে একটি default value পাস করতে পারেন। request এ input value উপস্থিত না থাকলে এই value টি রিটার্ন দিবে।

$name = $request->input('name', 'Sally');

অ্যারে ইনপুট ধারণকারী ফর্মগুলির সাথে কাজ করার সময়, অ্যারেগুলি অ্যাক্সেস করতে “dot” notation ব্যবহার করুন:

$name = $request->input('products.0.name');
 
$names = $request->input('products.*.name');

একটি associative array হিসাবে সমস্ত input value গুলোকে বের করার জন্য আপনি কোনও arguments ছাড়াই input method কে কল করতে পারেন:

$input = $request->input();

Retrieving Input From The Query String

যদিও input method টি request এর সবকিছু(query string সহ) থেকে value গুলি বের করে, query method টি শুধুমাত্র query string থেকে value গুলি বের করবে:

$name = $request->query('name');

request করা query string এর value ডেটা present না থাকলে, এই method এ দ্বিতীয় আর্গুমেন্ট রিটার্ন দেওয়া হবে:

$name = $request->query('name', 'Helen');

একটি associative array হিসাবে সমস্ত query string value গুলো বের করার জন্য আপনি কোনো argument ছাড়াই query method কে কল করতে পারেন:

$query = $request->query();

Mastering Laravel with ReactJS Course

Retrieving JSON Input Values

আপনার application এ JSON request গুলো পাঠানোর সময়, আপনি input method এর মাধ্যমে JSON ডেটা অ্যাক্সেস করতে পারেন যতক্ষণ না request এ Content-Type header টি application/json-এ সঠিকভাবে সেট করা থাকে। এমনকি আপনি JSON অ্যারেগুলির মধ্যে থাকা value গুলি বের করতে “dot” syntax ব্যবহার করতে পারেন:

$name = $request->input('user.name');

Retrieving Stringable Input Values

একটি primitive string হিসাবে request এর input data বের করার পরিবর্তে, আপনি Illuminate\Support\Stringable-এর instance হিসাবে request এর ডেটা বের করতে string method ব্যবহার করতে পারেন:

$name = $request->string('name')->trim();

Retrieving Boolean Input Values

checkbox গুলোর মতো HTML element গুলির সাথে কাজ করার সময়, আপনার application টি “truthy” value গুলি পেতে পারে যা আসলে string. উদাহরণস্বরূপ, “true” বা “on”। সুবিধার জন্য, আপনি boolean হিসাবে এই value গুলি বের করতে boolean method ব্যবহার করতে পারেন। boolean method 1, “1”, true, “true”, “on” এবং “yes” এর জন্য true রিটার্ন করে। অন্য সব value গুলো false রিটার্ন করবে। :

$archived = $request->boolean('archived');

Retrieving Date Input Values

সুবিধার জন্য, dates / times সম্বলিত input value গুলি date method ব্যবহার করে Carbon instances হিসাবে বের করা যেতে পারে। request এ প্রদত্ত নামের সাথে একটি input value না থাকলে, null রিটার্ন করা হবে:

$birthday = $request->date('birthday');

date method দ্বারা গৃহীত দ্বিতীয় এবং তৃতীয় arguments গুলো যথাক্রমে date’s format এবং timezone নির্দিষ্ট করতে ব্যবহার করা যেতে পারে:

$elapsed = $request->date('elapsed', '!H:i', 'Asia/Dhaka');

যদি input value উপস্থিত থাকে কিন্তু একটি invalid format থাকে, একটি InvalidArgumentException throw করা হবে; অতএব, এটি সুপারিশ করা হয় যে আপনি date method চালু করার আগে input টি validate করুন৷

Retrieving Input Via Dynamic Properties

আপনি Illuminate\Http\Request ইনস্ট্যান্সে dynamic properties ব্যবহার করে user input অ্যাক্সেস করতে পারেন। উদাহরণস্বরূপ, যদি আপনার application এর ফর্মগুলির মধ্যে একটিতে একটি name field থাকে, তাহলে আপনি এইভাবে field value অ্যাক্সেস করতে পারেন:

$name = $request->name;

dynamic property গুলো ব্যবহার করার সময়, Laravel প্রথমে request পেলোডে প্যারামিটারের value সন্ধান করবে। যদি এটি উপস্থিত না হয়, Laravel যেসব route এর সাথে ম্যাচ করবে তাদের parameter গুলিতে field টি অনুসন্ধান করবে।

Retrieving A Portion Of The Input Data

আপনি যদি input data এর একটি subset বের করতে চান তবে আপনি only এবং except method গুলি ব্যবহার করতে পারেন। এই উভয় method গুলো একটি একক অ্যারে বা আর্গুমেন্টের একটি dynamic list গ্রহণ করে:

$input = $request->only(['username', 'password']);

$input = $request->only('username', 'password');

$input = $request->except(['credit_card']);

$input = $request->except('credit_card');

only method টি আপনার request করা সমস্ত key / value জোড়া ফেরত দেয়; যাইহোক, এটি request উপস্থিত নয় এমন key / value জোড়া return দেবে না।

Determining If Input Is Present

request এর একটি মান উপস্থিত আছে কিনা তা নির্ধারণ করতে আপনি has method ব্যবহার করতে পারেন। request এ মান উপস্থিত থাকলে has method টি true রিটার্ন করবে:

if ($request->has('name')) {
    //
}

একটি array দেওয়া হলে, has method নির্ধারণ করবে যে সমস্ত নির্দিষ্ট values গুলো উপস্থিত আছে কিনা:

if ($request->has(['name', 'email'])) {
    //
}

request এ একটি value উপস্থিত থাকলে whenHas method প্রদত্ত closure কার্যকর করবে:

$request->whenHas('name', function ($input) {
    //
});

একটি দ্বিতীয় closure whenHas method e পাস করা যেতে পারে যেটি execute করা হবে যদি request এ নির্দিষ্ট value উপস্থিত না থাকে:

$request->whenHas('name', function ($input) {
    // The "name" value is present...
}, function () {
    // The "name" value is not present...
});

কোনো নির্দিষ্ট value উপস্থিত থাকলে hasAny method টি true return দেয়:

if ($request->hasAny(['name', 'email'])) {
    //
}

আপনি যদি নির্ধারণ করতে চান যে request এ একটি value আছে এবং empty না, আপনি filled method ব্যবহার করতে পারেন:

if ($request->filled('name')) {
    //
}

whenFilled method টি প্রদত্ত closure টি execute করবে, যদি request এ একটি value উপস্থিত থাকে এবং empty না থাকে:

$request->whenFilled('name', function ($input) {
    //
});

একটি দ্বিতীয় ক্লোজার whenFilled method এ পাস করা যেতে পারে যেটি execute করা হবে যদি নির্দিষ্ট value “filled” না হয়:

$request->whenFilled('name', function ($input) {
    // The "name" value is filled...
}, function () {
    // The "name" value is not filled...
});

একটি প্রদত্ত key, request থেকে অনুপস্থিত কিনা তা নির্ধারণ করতে, আপনি missing method ব্যবহার করতে পারেন:

if ($request->missing('name')) {
    //
}

Merging Additional Input

কখনও কখনও আপনাকে request এর বিদ্যমান input data তে অতিরিক্ত ইনপুট ম্যানুয়ালি মার্জ করতে হতে পারে। এটি সম্পন্ন করতে, আপনি merge method ব্যবহার করতে পারেন:

$request->merge(['votes' => 0]);

mergeIfMissing method টি request এ ইনপুট মার্জ করতে ব্যবহার করা যেতে পারে যদি request এর input data এর মধ্যে সংশ্লিষ্ট key গুলি ইতিমধ্যেই বিদ্যমান না থাকে:

$request->mergeIfMissing(['votes' => 0]);

Old Input

Laravel আপনাকে পরবর্তী request এর সময় একটি request থেকে input রাখার অনুমতি দেয়। এই ফীচার টি বিশেষত validation error গুলো সনাক্ত করার পরে ফর্মগুলি পুনরায় তৈরি করার জন্য উপযোগী। যাইহোক, যদি আপনি Laravel-এর অন্তর্ভুক্ত validation ফীচার গুলি ব্যবহার করেন, তাহলে এটা সম্ভব যে আপনাকে সরাসরি এই session input flashing method গুলি ম্যানুয়ালি ব্যবহার করতে হবে না, কারণ Laravel-এর কিছু built-in validation সুবিধা স্বয়ংক্রিয়ভাবে তাদের কল করবে।

Flashing Input To The Session

Illuminate\Http\Request ক্লাসের flash method টি বর্তমান input টিকে সেশনে flash করবে যাতে এটি ইউজারের পরবর্তী application এ request এর সময় available থাকে:

$request->flash();

আপনি সেশনে request ডেটার একটি subset flash করার জন্য flashOnly এবং flashExcept method ব্যবহার করতে পারেন। এই method গুলি সেশনের বাইরে পাসওয়ার্ডের মতো sensitive তথ্য রাখার জন্য দরকারী:

$request->flashOnly(['username', 'email']);
 
$request->flashExcept('password');

Flashing Input Then Redirecting

যেহেতু আপনি প্রায়শই সেশনে flash input করতে চান এবং তারপরে পূর্ববর্তী পৃষ্ঠায় redirect করতে চান, আপনি সহজেই withInput method ব্যবহার করে একটি redirect ইনপুট ফ্ল্যাশিং চেইন করতে পারেন:

return redirect('form')->withInput();
 
return redirect()->route('user.create')->withInput();
 
return redirect('form')->withInput(
    $request->except('password')
);

Retrieving Old Input

পূর্ববর্তী request থেকে flash করা input বের করতে, Illuminate\Http\Request-এর একটি instance এ old method টি ব্যবহার করুন। old method টি session থেকে পূর্বে flash করা input data টানবে:

$username = $request->old('username');

এছাড়াও Laravel একটি global old helper প্রদান করে. আপনি যদি Blade template এর মধ্যে পুরানো ইনপুট প্রদর্শন করেন, তাহলে ফর্মটি repopulate করতে old helper মেথড ব্যবহার করা আরও সুবিধাজনক। প্রদত্ত field এর জন্য কোন পুরানো ইনপুট বিদ্যমান না থাকলে, null রিটার্ন দেওয়া হবে:

<input type="text" name="username" value="{{ old('username') }}">

Cookies

Retrieving Cookies From Requests

Laravel framework দ্বারা তৈরি সমস্ত কুকি encrypted করা থাকে এবং একটি authentication code সহ signed হয়, যার অর্থ ক্লায়েন্ট দ্বারা পরিবর্তন করা হলে সেগুলি অবৈধ বলে বিবেচিত হবে৷ request থেকে একটি cookie এর মান বের করতে, একটি Illuminate\Http\Request instance এ cookie method ব্যবহার করুন:

$value = $request->cookie('name');

Input Trimming & Normalization

ডিফল্টরূপে, Laravel আপনার অ্যাপ্লিকেশনের global middleware stack এ App\Http\Middleware\TrimStrings এবং App\Http\Middleware\ConvertEmptyStringsToNull মিডলওয়্যার অন্তর্ভুক্ত করে। এই মিডলওয়্যারগুলি App\Http\Kernel ক্লাস দ্বারা global middleware stack এ লিস্ট করা হয়েছে। এই মিডলওয়্যারগুলি request এ সমস্ত আগত string field গুলিকে স্বয়ংক্রিয়ভাবে trim করবে, সেইসাথে যেকোন খালি string field গুলিকে null এ রূপান্তর করবে। এটি আপনাকে আপনার route এবং controller গুলিতে এই normalization এর ভয় গুলি সম্পর্কে চিন্তা করতে হবে না।

Disabling Input Normalization

আপনি যদি সমস্ত request গুলোর জন্য এই behavior টি disable করতে চান, তাহলে আপনি আপনার App\Http\Kernel ক্লাসের $middleware property থেকে আপনার অ্যাপ্লিকেশনের মিডলওয়্যার স্ট্যাক থেকে দুটি মিডলওয়্যার রিমুভ করে ফেলতে পারেন।

আপনি যদি আপনার অ্যাপ্লিকেশনে request গুলোর একটি subset জন্য string trimming এবং empty string conversion কে disable করতে চান, আপনি উভয় মিডলওয়্যার দ্বারা প্রস্তাবিত skipWhen method ব্যবহার করতে পারেন। এই method টি একটি closure স্বীকার করে যা ইনপুট normalization এড়িয়ে যাওয়া উচিত কিনা তা নির্দেশ করার জন্য সত্য বা মিথ্যা ফেরত দেওয়া উচিত। সাধারণত, skipWhen পদ্ধতিটি আপনার অ্যাপ্লিকেশনের AppServiceProvider-এর বুট পদ্ধতিতে ব্যবহার করা উচিত।

use App\Http\Middleware\ConvertEmptyStringsToNull;
use App\Http\Middleware\TrimStrings;
 
/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    TrimStrings::skipWhen(function ($request) {
        return $request->is('admin/*');
    });
 
    ConvertEmptyStringsToNull::skipWhen(function ($request) {
        // ...
    });
}

Mastering Laravel with ReactJS Course

Files

Retrieving Uploaded Files

আপনি Illuminate\Http\Request instance থেকে file method অথবা dynamic properties ব্যবহার করে আপলোড করা ফাইলগুলি বের করতে পারেন। file method Illuminate\Http\UploadedFile ক্লাসের একটি instance রিটার্ন করে, যা PHP SplFileInfo ক্লাসকে extends করে এবং ফাইলের সাথে ইন্টারঅ্যাক্ট করার জন্য বিভিন্ন method গুলো প্রদান করে:

$file = $request->file('photo');
 
$file = $request->photo;

আপনি hasFile method ব্যবহার করে request e একটি ফাইল present আছে কিনা তা নির্ধারণ করতে পারেন:

if ($request->hasFile('photo')) {
    //
}

Validating Successful Uploads

File টি উপস্থিত আছে কিনা তা চেক করার পাশাপাশি, আপনি যাচাই করতে পারেন যে isValid method এর মাধ্যমে ফাইলটি আপলোড করতে কোনো সমস্যা হয়নি:

if ($request->file('photo')->isValid()) {
    //
}

File Paths & Extensions

UploadedFile ক্লাসে ফাইলের fully-qualified path এবং এর extension অ্যাক্সেস করার method গুলো রয়েছে। extension method ফাইলের বিষয়বস্তুর উপর ভিত্তি করে এর এক্সটেনশন অনুমান করার চেষ্টা করবে। এই extension টি client দ্বারা সরবরাহ করা extension থেকে ভিন্ন হলেও:

$path = $request->photo->path();
 
$extension = $request->photo->extension();

Storing Uploaded Files

একটি আপলোড করা ফাইল সংরক্ষণ করতে, আপনি সাধারণত আপনার কনফিগার করা filesystem গুলির একটি ব্যবহার করবেন৷ UploadedFile ক্লাসের একটি store method রয়েছে যা একটি আপলোড করা ফাইলকে আপনার একটি ডিস্কে স্থানান্তরিত করবে, যা আপনার local filesystem এর একটি অবস্থান বা Amazon S3 এর মতো একটি ক্লাউড স্টোরেজ অবস্থান হতে পারে।

store method টি সেই পাথ গ্রহণ করে যেখানে ফাইলটি filesystem এর configured করা root directory এর সাপেক্ষে store করা উচিত। এই পাথে একটি filename থাকা উচিত নয়, যেহেতু ফাইলের নাম হিসাবে পরিবেশন করার জন্য একটি unique ID স্বয়ংক্রিয়ভাবে তৈরি হবে।

store method টি ডিস্কের নামের জন্য একটি optional দ্বিতীয় আর্গুমেন্টও গ্রহণ করে যা ফাইলটি সংরক্ষণ করতে ব্যবহার করা উচিত। method টি ডিস্কের রুটের সাথে সম্পর্কিত ফাইলের পাথ ফিরিয়ে দেবে:

$path = $request->photo->store('images');
 
$path = $request->photo->store('images', 's3');

আপনি যদি একটি ফাইলের নাম স্বয়ংক্রিয়ভাবে তৈরি করতে না চান, তাহলে আপনি storeAs method ব্যবহার করতে পারেন, যা তার আর্গুমেন্ট হিসাবে পাথ, ফাইলের নাম এবং ডিস্কের নাম গ্রহণ করে:

$path = $request->photo->storeAs('images', 'filename.jpg');
 
$path = $request->photo->storeAs('images', 'filename.jpg', 's3');

Configuring Trusted Proxies

যখন আপনার অ্যাপ্লিকেশনগুলির ব্যাকগ্রাউন্ডে একটি load balancer চালান যা TLS/SSL certificates গুলিকে বন্ধ করে দেয়, আপনি লক্ষ্য করতে পারেন যে কখনও কখনও url helper ব্যবহার করার সময় আপনার application টি HTTPS লিঙ্ক তৈরি করে না। সাধারণত এটি হয় কারণ আপনার application টি port 80-এ আপনার লোড ব্যালেন্সার থেকে ট্র্যাফিক ফরোয়ার্ড করা হচ্ছে এবং এটি নিরাপদ সিকিউর লিংক তৈরি করবে তা জানেন না।

এটি সমাধান করার জন্য, আপনি App\Http\Middleware\TrustProxies middleware ব্যবহার করতে পারেন যা আপনার Laravel application এ অন্তর্ভুক্ত রয়েছে, যা আপনাকে দ্রুত লোড ব্যালেন্সার বা প্রক্সিগুলিকে কাস্টমাইজ করতে দেয় যা আপনার অ্যাপ্লিকেশন দ্বারা বিশ্বাস করা উচিত। আপনার Trusted proxy গুলিকে এই মিডলওয়্যারের $proxies property তে একটি অ্যারে হিসাবে তালিকাভুক্ত করা উচিত৷ Trusted proxy গুলো কনফিগার করার পাশাপাশি, আপনি proxy $header গুলো কনফিগার করতে পারেন যা বিশ্বস্ত হওয়া উচিত:

আপনি যদি AWS Elastic Load Balancing ব্যবহার করেন, তাহলে আপনার $headers এর মান Request::HEADER_X_FORWARDED_AWS_ELB হওয়া উচিত।

Trusting All Proxies

আপনি যদি Amazon AWS বা অন্য “ক্লাউড” load balancer provider ব্যবহার করেন, তাহলে আপনি আপনার প্রকৃত ব্যালেন্সারের আইপি ঠিকানা নাও জানতে পারেন। এই ক্ষেত্রে, আপনি সমস্ত প্রক্সিকে বিশ্বাস করতে * ব্যবহার করতে পারেন:

/**
 * The trusted proxies for this application.
 *
 * @var string|array
 */
protected $proxies = '*';

Configuring Trusted Hosts

ডিফল্টরূপে, লারাভেল HTTP request গুলোর Host header এর বিষয়বস্তু নির্বিশেষে প্রাপ্ত সমস্ত request সাড়া দেবে। উপরন্তু, একটি ওয়েব request এর সময় আপনার অ্যাপ্লিকেশনে request URL তৈরি করার সময় Host header এর value ব্যবহার করা হবে।

সাধারণত, আপনার ওয়েব সার্ভার কনফিগার করা উচিত, যেমন Nginx বা Apache, শুধুমাত্র আপনার অ্যাপ্লিকেশনে request গুলো পাঠাতে যা একটি প্রদত্ত হোস্ট নামের সাথে মেলে। যাইহোক, আপনার যদি সরাসরি আপনার ওয়েব সার্ভার কাস্টমাইজ করার ক্ষমতা না থাকে এবং লারাভেলকে শুধুমাত্র কিছু হোস্ট নামের প্রতিক্রিয়া জানাতে নির্দেশ দিতে হয়, তাহলে আপনি আপনার অ্যাপ্লিকেশনের জন্য App\Http\Middleware\TrustHosts মিডলওয়্যার এনাবল করে তা করতে পারেন।

TrustHosts middleware ইতিমধ্যেই আপনার অ্যাপ্লিকেশনের $middleware স্ট্যাকে অন্তর্ভুক্ত করা হয়েছে; যাইহোক, আপনার এটিকে uncomment করা উচিত যাতে এটি active হয়। এই middleware এর hosts method এর মধ্যে, আপনি হোস্টের নামগুলি নির্দিষ্ট করতে পারেন যেগুলোকে আপনার অ্যাপ্লিকেশনটির respond জানাতে হবে। অন্যান্য হোস্ট মান headers সহ আগত request গুলি reject করা হবে:

/**
 * Get the host patterns that should be trusted.
 *
 * @return array
 */
public function hosts()
{
    return [
        'laravel.test',
        $this->allSubdomainsOfApplicationUrl(),
    ];
}

allSubdomainsOfApplicationUrl helper method টি আপনার অ্যাপ্লিকেশনের app.url কনফিগারেশন মানের সমস্ত সাবডোমেনের সাথে মিলে যাওয়া একটি regular expression প্রদান করবে। এই helper method টি wildcard subdomain সমূহ ব্যবহার করে এমন একটি অ্যাপ্লিকেশন তৈরি করার সময় আপনার অ্যাপ্লিকেশনের সমস্ত সাবডোমেনকে অনুমতি দেওয়ার একটি সুবিধাজনক উপায় প্রদান করে৷

আমি মাসুদ আলম, বাংলাদেশের ৩৬ তম Zend Certified Engineer । ২০০৯ সালে কম্পিউটার সাইন্স থেকে বেচেলর ডিগ্রী অর্জন করি। দীর্ঘ ১৫ বছর আমি Winux Soft, SSL Wireless, IBCS-PRIMAX, Max Group, Canadian International Development Agency (CIDA), Care Bangladesh, World Vision, Hellen Keller, Amarbebsha Ltd সহ বিভিন্ন দেশি বিদেশী কোম্পানিতে ডেটা সাইন্স, মেশিন লার্নিং, বিগ ডেটা, ওয়েব ডেভেলপমেন্ট এবং সফটওয়্যার ডেভেলপমেন্ট এর উপর বিভিন্ন লিডিং পজিশন এ চাকরি এবং প্রজেক্ট লিড করি। এছাড়াও বাংলাদেশের ১৮৫ জন জেন্ড সার্টিফাইড ইঞ্জিনিয়ার এর মধ্যে ১২০ এরও অধিক ছাত্র আমার হাতে জেন্ড সার্টিফাইড ইঞ্জিনিয়ার হয়েছেন। বর্তমানে w3programmers ট্রেনিং ইনস্টিটিউট এ PHP এর উপর Professional এবং Advance Zend Certified PHP -8.2 Engineering, Laravel Mastering Course with ReactJS, Python Beginning To Advance with Blockchain, Machine Learning and Data Science, Professional WordPress Plugin Development Beginning to Advance কোর্স করাই। আর অবসর সময়ে w3programmers.com এ ওয়েব টেকনোলজি নিয়ে লেখালেখি করি।

Leave a Reply