Laravel Framework Basics
Laravel Framework Basics পর্ব-৮: LARAVEL HTTP Response
HTTP response কি?
Web application এ HTTP Response এক ধরণের বার্তা (Message) যা একটি client কে উদ্যেশ্য করে একটি server দ্বারা তৈরি করা হয়। server থেকে Response তৈরির উদ্যেশ্য হল client কর্তৃক অনুরোধ (Request) এর বিপরীতে একটা বার্তা (Message) সরবরাহ করা। এছাড়াও ক্লায়েন্টকে জানানো যে আপনার অনুরোধ করা পদক্ষেপটি সঠিক ভাবে সম্পন্ন হয়েছে; অথবা ক্লায়েন্টকে জানান যে তার অনুরোধ প্রক্রিয়াকরণে একটি (error) ত্রুটি ঘটেছে।
একটি HTTP Response এ সাধারণত তিনটি বিষয় থাকে:
১. Status Line
২. বিভিন্ন ধরণের HTTP Header বা header field গুলির একটি সিরিজ।
৩. একটি message body, যেটি মূলত সবচেয়ে বেশি কাজে লাগে।
Status line
status line হল HTTP Response message এর প্রথম লাইন। এতে তিনটি বিষয় থাকে:
- HTTP version নম্বর।
- একটি status code, যেটি মূলতঃ একটি তিন-সংখ্যার নম্বর । যা দিয়ে আমরা বুঝতে পারি সার্ভার এর রেসপন্স এই মুহূর্তে কি অবস্থায় আছে।
- একটি status text, যা মূলতঃ status code এর সক্ষিপ্ত বিবরণ, যা দিয়ে আমরা server এর status আরো ভালোভাবে বুঝতে পারি যে সার্ভার এর রেসপন্স এই মুহূর্তে কি অবস্থায় আছে।
একটি response line এর দেখতে কেমন বা কিভাবে আসে , তা নিচের উদাহরণে দেয়া হল:
HTTP/1.1 200 OK
উপরের উদাহরণে নিম্নোক্ত তিনটি বিষয় লক্ষ্য করবেন :
- প্রথমটি HTTP version নম্বর : HTTP/1.1
- দ্বিতীয় অংশটি হচ্ছে status code : 200
- আর সর্বশেষ হচ্ছে status text: OK
HTTP headers
একটি সার্ভারের response এর জন্য HTTP header গুলি এমন তথ্য ধারণ করে যা একজন ক্লায়েন্ট response সম্পর্কে এবং যে সার্ভারটি পাঠিয়েছে সে সম্পর্কে আরও জানতে ব্যবহার করতে পারে। এই তথ্যটি ক্লায়েন্টকে ব্যবহারকারীর response প্রদর্শন করতে, ভবিষ্যতে ব্যবহারের জন্য response সংরক্ষণ (বা ক্যাশে) করতে এবং সার্ভারে এখন বা ভবিষ্যতে আরও response করতে সহায়তা করতে পারে। উদাহরণ স্বরূপ, নিচের header গুলির সিরিজ ক্লায়েন্টকে বলে যে প্রতিক্রিয়াটি পাঠানো হয়েছিল, নিচে একটি JPEG ছবির header লক্ষ্য করুন :
Date: Sun, 12 Jun 2022 12:07:48 GMT Server: w3programmers.com Content-type: image/jpg
একটি সার্ভারের response এর জন্য HTTP header নিম্নোক্ত ফিল্ড গুলো থাকতে পারে :
- Accept-Ranges
- Age
- ETag
- Location
- Proxy-Authenticate
- Retry-After
- Server
- Vary
- WWW-Authenticate
Message body
ক্লায়েন্ট পর্যায়ে response এর জন্য সবচেয়ে বেশি ব্যবহৃত হয় Message body. মেসেজ বডিতে ক্লায়েন্টের অনুরোধ করা রিসোর্স সম্পর্কে প্রকৃত তথ্য থাকে।
Creating Laravel HTTP Response
Strings এবং Arrays Responses
লারাভেলে route এবং controller দুই জায়গা থেকেই আপনি response পাঠাতে পারেন। আর এই Response পাঠানোর জন্য Laravel এ বিভিন্ন উপায় রয়েছে। সবচেয়ে basic response হল একটি route বা controller থেকে একটি string রিটার্ন দেওয়া। আর লারাভেল ফ্রেমওয়ার্ক স্বয়ংক্রিয়ভাবে উক্ত স্ট্রিংটিকে Laravel HTTP Response এ রূপান্তর করবে:
Route::get('/', function () { return 'Hello World'; });
আপনার route এবং controller থেকে strings ফেরত দেওয়ার পাশাপাশি, আপনি arrays রিটার্ন করতে পারেন। Laravel Framework স্বয়ংক্রিয়ভাবে array টিকে একটি JSON response এ রূপান্তর করবে:
Route::get('/', function () { return [1, 2, 3]; });
Laravel HTTP Response Objects
সাধারণত, আপনি আপনার route action গুলো থেকে সহজ strings বা arrays রিটার্ন করবেন না। তার পরিবর্তে, আপনি চাইলে সম্পূর্ণ Illuminate\Http\Response ইন্সটান্স বা ভিউ views তে রিটার্ন করতে পারবেন।
একটি full Response instance রিটার্ন করার সময় আপনি চাইলে HTTP Response status code এবং headers গুলি কাস্টমাইজ করতে পারেন৷ Response instance টি Symfony\Component\HttpFoundation\Response class থেকে inherits সূত্রে পাওয়া , যা HTTP responses গুলো তৈরির জন্য বিভিন্ন methods প্রদান করে:
Route::get('/home', function () { return response('Hello World', 200) ->header('Content-Type', 'text/plain'); });
Eloquent Models এবং Collections
এছাড়াও আপনি আপনার routes এবং controllers থেকে সরাসরি Eloquent ORM Model এবং collections রিটার্ন করতে পারেন। যখন আপনি করবেন, Laravel Framework স্বয়ংক্রিয়ভাবে ORM Model এবং collections গুলিকে JSON responses এ রূপান্তর করবে এবং মডেলের hidden attribute গুলিকে hidden রাখবে :
use App\Models\User; Route::get('/user/{user}', function (User $user) { return $user; });
LARAVEL HTTP Response গুলোতে Headers অ্যাটাচ করা
একটা বিষয় মনে রাখবেন যে বেশিরভাগ response methods গুলি চেইনযোগ্য, এতে response instances গুলো সহজভাবে তৈরির একটা সুযোগ সৃষ্টি হয় । উদাহরণস্বরূপ, ইউজারের কাছে ফেরত পাঠানোর আগে response টিতে হেডারের একটি সিরিজ যোগ করতে আপনি header method ব্যবহার করতে পারেন:
return response($content) ->header('Content-Type', $type) ->header('X-Header-One', 'Header Value') ->header('X-Header-Two', 'Header Value');
অথবা, আপনি response এ headers গুলোর একটি নির্দিষ্ট অ্যারে যুক্ত করতে withHeaders method ব্যবহার করতে পারেন:
return response($content) ->withHeaders([ 'Content-Type' => $type, 'X-Header-One' => 'Header Value', 'X-Header-Two' => 'Header Value', ]);
Cache Control Middleware
Laravel একটি cache.headers middleware অন্তর্ভুক্ত করে, যা routes গুলোতে একটি গ্রুপের জন্য দ্রুত Cache-Control হেডার সেট করতে ব্যবহার করা যেতে পারে। সংশ্লিষ্ট Cache-Control নির্দেশের সমতুল্য “snake case” ব্যবহার করে নির্দেশাবলী প্রদান করা উচিত এবং একটি সেমিকোলন দ্বারা পৃথক করা উচিত। যদি নির্দেশাবলীর তালিকায় etag নির্দিষ্ট করা থাকে, তাহলে LARAVEL HTTP Response content একটি MD5 হ্যাশ স্বয়ংক্রিয়ভাবে ETag identifier হিসাবে সেট করা হবে:
Route::middleware('cache.headers:public;max_age=2628000;etag')->group(function () { Route::get('/privacy', function () { // ... }); Route::get('/terms', function () { // ... }); });
LARAVEL HTTP Response গুলিতে Cookies সংযুক্ত করা
আপনি cookie method ব্যবহার করে একটি outgoing Illuminate\Http\Response instance এ একটি cookie সংযুক্ত করতে পারেন। আপনি cookie name, value এবং এই method এ কত মিনিট কুকিটি বৈধ বলে বিবেচিত হবে তা পাস করা উচিত:
return response('Hello World')->cookie( 'name', 'value', $minutes );
cookie method টি আরও কিছু arguments গ্রহণ করে যা খুব বেশি ব্যবহার করা হয় না । সাধারণত, এই arguments গুলোর উদ্দেশ্য একই এবং arguments গুলো PHP এর native setcookie method এর মতো।
return response('Hello World')->cookie( 'name', 'value', $minutes, $path, $domain, $secure, $httpOnly );
আপনি যদি নিশ্চিত করতে চান যে outgoing response সহ একটি cookie পাঠানো হয়েছে কিন্তু আপনার কাছে এখনও সেই response এর একটি instance নেই, এক্ষেত্রে আপনি Cookie facade টি ব্যবহার করতে পারেন “queue” cookies গুলি পাঠানোর সময় response সাথে সংযুক্ত করার জন্য। queue method একটি cookie instance তৈরি করার জন্য প্রয়োজনীয় arguments গুলো গ্রহণ করে। এই cookie গুলি ব্রাউজারে পাঠানোর আগে outgoing response এর সাথে attached করা হবে:
use Illuminate\Support\Facades\Cookie; Cookie::queue('name', 'value', $minutes);
Generating Cookie Instances
আপনি যদি এমন একটি Symfony\Component\HttpFoundation\Cookie instance তৈরি করতে চান যা পরবর্তী সময়ে একটি response instance এর সাথে attached করা যেতে পারে, আপনি global cookie helper ব্যবহার করতে পারেন। এই কুকিটি ক্লায়েন্টের কাছে ফেরত পাঠানো হবে না যদি না এটির সাথে একটি response instance সাথে attached থাকে:
$cookie = cookie('name', 'value', $minutes); return response('Hello World')->cookie($cookie);
Expiring Cookies Early
আপনি চাইলে outgoing response এ withoutCookie method ব্যবহার করে একটি cookie এর মেয়াদ শেষ করার মাধ্যমে উক্ত কুকিটি রিমুভ করতে পারেন:
return response('Hello World')->withoutCookie('name');
যদি আপনার কাছে এখনও outgoing response এর একটি instance না থাকে, তাহলে আপনি Cookie মেয়াদ শেষ করার জন্য Cookie facade এর expire method ব্যবহার করতে পারেন:
Cookie::expire('name');
Cookies & Encryption
বাই ডিফল্ট , LARAVEL HTTP Response এ লারাভেল দ্বারা জেনারেটেড সমস্ত cookies গুলো encrypted থাকে এবং signed থাকে , যার জন্যে এই cookies গুলো ক্লায়েন্ট দ্বারা modified বা read করা যায়না। আপনি যদি আপনার অ্যাপ্লিকেশন দ্বারা generated কুকিগুলির একটি subset এর জন্য encryption কে ডিজ্যাবল করতে চান, আপনি App\Http\Middleware\EncryptCookies middleware এর $except property ব্যবহার করতে পারেন, যা app/Http/Middleware ডিরেক্টরিতে অবস্থিত।
/** * The names of the cookies that should not be encrypted. * * @var array */ protected $except = [ 'cookie_name', ];
Redirects
Redirect response গুলো হলIlluminate\Http\RedirectResponse class এর instances , এবং ইউজার কে অন্য URL redirect করার জন্য প্রয়োজনীয় সঠিক headers থাকে। একটি RedirectResponse instance তৈরি করার বিভিন্ন উপায় রয়েছে। সবচেয়ে সহজ পদ্ধতি হল global redirect helperব্যবহার করা:
Route::get('/dashboard', function () { return redirect('home/dashboard'); });
কখনো কখনো LARAVEL HTTP Response এ আপনি ইউজার কে তাদের previous location এ redirect করতে চাইতে পারেন, যেমন submitted form টি invalid। এর জন্য আপনি global back helper function ব্যবহার করে তা করতে পারেন। যেহেতু এই feature টি session ব্যবহার করে, নিশ্চিত করুন যে route টি back function কল করছে সেটি web middleware group ব্যবহার করছে:
Route::post('/user/profile', function () { // Validate the request... return back()->withInput(); });
Redirecting To Named Routes
যখন আপনি কোনো parameters ছাড়াই redirect helper কে কল করেন, তখন Illuminate\Routing\Redirector-এর একটি instance দেওয়া হয়, যা আপনাকে Redirector instance এ যেকোনো method কে কল করার অনুমতি দেয়। উদাহরণস্বরূপ, একটি named route এ একটি RedirectResponse তৈরি করতে, আপনি route method ব্যবহার করতে পারেন:
return redirect()->route('login');
যদি আপনার route এ parameters থাকে, তাহলে আপনি সেগুলিকে route method এ second argument হিসেবে পাস করতে পারেন:
// For a route with the following URI: /profile/{id} return redirect()->route('profile', ['id' => 1]);
LARAVEL HTTP Response এ Eloquent Models এর মাধ্যমে Parameters সমূহ পপুলেট করা
আপনি যদি একটি “ID” parameter সহ একটি route কে redirect করেন যা একটি Eloquent model থেকে পপুলেট করা , আপনি চাইলে নিজেই মডেলটি পাস করতে পারেন৷ ID টি automatically বের করা হবে:
// For a route with the following URI: /profile/{id} return redirect()->route('profile', [$user]);
আপনি যদি route parameter এ রাখা value টিকে customize করতে চান, তাহলে আপনি route parameter definition এ (/profile/{id:slug}) কলামটি নির্দিষ্ট করতে পারেন অথবা আপনি আপনারEloquent model এ getRouteKey method টি override করতে পারেন:
/** * Get the value of the model's route key. * * @return mixed */ public function getRouteKey() { return $this->slug; }
Redirecting To Controller Actions
আপনি controller action এ রিডাইরেক্ট গুলো তৈরি করতে পারেন। এটি করতে,controller এবং action name এবং action method পাস করুন:
use App\Http\Controllers\UserController; return redirect()->action([UserController::class, 'index']);
যদি আপনার controller route এর parameter গুলোর প্রয়োজন হয়, আপনি সেগুলিকে action method এর second argument হিসাবে পাস করতে পারেন:
return redirect()->action( [UserController::class, 'profile'], ['id' => 1] );
LARAVEL HTTP Response এ External Domains সমূহে Redirect করা
কখনও কখনও আপনাকে আপনার অ্যাপ্লিকেশনের বাইরে একটি domain এ redirect করতে হতে পারে। আপনি away method কল করে তা করতে পারেন, যা কোনো অতিরিক্ত URL encoding, validation বা verification ছাড়াই একটি RedirectResponse তৈরি করে:
return redirect()->away('https://www.google.com');
Redirecting With Flashed Session Data
একটি নতুন URL-এ Redirect করা এবং সেশনে data flashing করা সাধারণত একই সময়ে করা হয়। সাধারণত, আপনি যখন সেশনে একটি success message ফ্ল্যাশ করেন তখন এটি সফলভাবে একটি action সম্পাদন করার পরে করা হয়। সুবিধার জন্য, আপনি একটি সেশনে fluent method chain এ একটি RedirectResponse instance এবং flash data তৈরি করতে পারেন:
Route::post('/user/profile', function () { // ... return redirect('dashboard')->with('status', 'Profile updated!'); });
ইউজারকে redirect করার পরে, আপনি সেশন থেকে ফ্ল্যাশ করা message প্রদর্শন করতে পারেন। উদাহরণস্বরূপ, Blade syntax ব্যবহার করে:
@if (session('status')) <div class="alert alert-success"> {{ session('status') }} </div> @endif
Redirecting With Input
আপনি ইউজারকে একটি নতুন অবস্থানে redirect করার আগে সেশনে বর্তমান অনুরোধের ইনপুট ডেটা ফ্ল্যাশ করতে RedirectResponse instance দ্বারা প্রদত্ত withInput method ব্যবহার করতে পারেন। এটি সাধারণত করা হয় যদি ইউজার একটি validation error সম্মুখীন হয়। একবার ইনপুটটি সেশনে ফ্ল্যাশ হয়ে গেলে, আপনি ফর্মটি পুনরায় পূরণ করার পরবর্তী request এর সময় সহজেই এটি retrieve করতে পারেন:
return back()->withInput();
LARAVEL HTTP Response এ অন্যান্য Response Types
response helper অন্যান্য ধরনের response instances তৈরি করতে ব্যবহার করা যেতে পারে। যখন response helper কে arguments ছাড়া কল করা হয়, তখনIlluminate\Contracts\Routing\ResponseFactory contract একটি implementation রিটার্ন দেয় । এই contract response গুলো তৈরি করার জন্য বিভিন্ন helpful method সমূহ প্রদান করে।
LARAVEL HTTP Response এ View Responses
আপনার যদি response status এবং headers গুলির উপর নিয়ন্ত্রণের প্রয়োজন হয় তবে response’s content হিসাবে একটি view রিটার্ন দেওয়ার প্রয়োজন হয় তবে আপনার view method টি ব্যবহার করা উচিত:
return response() ->view('hello', $data, 200) ->header('Content-Type', $type);
অবশ্যই, যদি আপনাকে একটি custom HTTP status code বা custom header পাস করার প্রয়োজন না হয়, আপনি global view helper function ব্যবহার করতে পারেন।
JSON Responses
json method টি স্বয়ংক্রিয়ভাবে Content-Type header টিকে application/json -এ সেট করবে, পাশাপাশি json_encode PHP ফাংশন ব্যবহার করে প্রদত্ত অ্যারেকে JSON-এ রূপান্তর করবে:
return response()->json([ 'name' => 'Abigail', 'state' => 'CA', ]);
আপনি যদি একটি JSONP response তৈরি করতে চান, তাহলে আপনি withCallback method এর সাথে json method টি ব্যবহার করতে পারেন:
return response() ->json(['name' => 'Abigail', 'state' => 'CA']) ->withCallback($request->input('callback'));
File Downloads
download method টি একটি response তৈরি করতে ব্যবহার করা যেতে পারে যা ব্যবহারকারীর ব্রাউজারকে প্রদত্ত পাথে ফাইলটি ডাউনলোড করতে বাধ্য করে। download method টি মেথডের second argument হিসাবে একটি ফাইলের নাম গ্রহণ করে, যা ফাইলটি ডাউনলোড করার সময় ইউজার দ্বারা দেখা ফাইলের নাম নির্ধারণ করবে। অবশেষে, আপনি মেথডের তৃতীয় আর্গুমেন্ট হিসাবে HTTP হেডারগুলির একটি অ্যারে পাস করতে পারেন:
return response()->download($pathToFile); return response()->download($pathToFile, $name, $headers);
Streamed Downloads
কখনও কখনও আপনি ডিস্কে অপারেশনের বিষয়বস্তু না লিখেই একটি প্রদত্ত অপারেশনের string response টিকে ডাউনলোডযোগ্য response পরিণত করতে চাইতে পারেন। আপনি এই অবস্থায় streamDownload method ব্যবহার করতে পারেন। এই method টি তার argument হিসাবে একটি callback, filename এবং headers গুলির একটি optional array গ্রহণ করে
use App\Services\GitHub; return response()->streamDownload(function () { echo GitHub::api('repo') ->contents() ->readme('laravel', 'laravel')['contents']; }, 'laravel-readme.md');
File Responses
file method টি ডাউনলোড শুরু করার পরিবর্তে সরাসরি ব্যবহারকারীর ব্রাউজারে একটি ফাইল, যেমন একটি image বা PDF প্রদর্শন করতে ব্যবহার করা যেতে পারে। এই method টি ফাইলের পাথটিকে তার প্রথম আর্গুমেন্ট হিসাবে এবং দ্বিতীয় আর্গুমেন্ট হিসাবে হেডারগুলির একটি অ্যারেকে গ্রহণ করে:
return response()->file($pathToFile); return response()->file($pathToFile, $headers);
Response Macros
আপনি যদি একটি custom response define করতে চান যা আপনি আপনার বিভিন্ন routes এবং controller গুলোতে পুনরায় ব্যবহার করতে পারেন, আপনি Response facade এর macro method ব্যবহার করতে পারেন। সাধারণত, আপনার service provider প্রদানকারীর একটির boot method থেকে এই পদ্ধতিটি কল করা উচিত, যেমন App\Providers\AppServiceProvider service provider:
<?php namespace App\Providers; use Illuminate\Support\Facades\Response; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { Response::macro('caps', function ($value) { return Response::make(strtoupper($value)); }); } }
macro function তার প্রথম আর্গুমেন্ট হিসাবে একটি name এবং দ্বিতীয় আর্গুমেন্ট হিসাবে একটি closure গ্রহণ করে। একটি ResponseFactory implementation বা response helper থেকে macro name কল করার সময় macro’s closure কার্যকর করা হবে:
return response()->caps('foo');