Laravel Framework Basics
LARAVEL FRAMEWORK BASICS পর্ব-১৫: Laravel Session
Laravel Session কি?
Laravel Session ব্যবহার করে আমরা ইউজারের তথ্য সুরক্ষিত করতে পারি। কেননা লারাভেল সেশনে রাখা যেকোনো তথ্য Update করা বা Write করা যায়না। এর জন্য Laravel Session প্রতিটি রিকোয়েস্টের বিপরীতে একটি unique id বরাদ্দ করে যা দিয়ে পরবর্তীতে লারাভেল সেশনে রক্ষিত value পেতে ব্যবহৃত হয়।
এছাড়াও Laravel যখন একটি সেশন তৈরি করে, তখন এটি cookie ব্যবহার করে ভিজিটরের কম্পিউটারেও একটি unique session সংরক্ষণ করে এবং সার্ভারে প্রতিটি Request কে retrieve করে।
Laravel Framework এ Session পরিচালনা করা খুবই সহজ। Laravel 9-এ Session Handling করার জন্য একাধিক ড্রাইভার রয়েছে, যেমন: file, APC, cookie, Memcached, array, database, এবং Redis. আপনি চাইলে এগুলোর যেকোনোটির একটিতে session Data গুলি সংরক্ষণ করতে পারেন। তবে বাই ডিফল্ট, Laravel session Data গুলি file Session driver এ সংরক্ষণ করা হয়। আর এটি config/session.php ফাইল এ থাকে। Laravel File Session Driver অধিকাংশ অ্যাপ্লিকেশনের সাথে ভালভাবে কাজ করে। তবে আপনি File Session Driver ছাড়া অন্য যেকোনো Driver এ সংরক্ষণ করতে হলে, আপনাকে .env ফাইলে সংশ্লিষ্ট ড্রাইভারটি পরিবর্তন করতে হবে।
যদি আপনার অ্যাপ্লিকেশনটি একাধিক ওয়েব সার্ভারে হোস্ট করা থাকে , এবং সবগুলো সার্ভার জুড়ে load balancing System করা হয়, তাহলে আপনাকে একটি centralized store পদ্ধতি বেছে নিতে হবে যেন সবগুলো সার্ভার প্রয়োজনে অ্যাক্সেস করতে পারে, যেমন Redis বা database এর মতো Session Driver.
Interacting With Laravel Session
Retrieving Session Data
Laravel Session Data নিয়ে কাজ করার দুটি প্রাথমিক উপায় রয়েছে: একটি হচ্ছে global session helper এবং অন্যটি হচ্ছে Request instance এর মাধ্যমে। প্রথমে, চলুন একটি Request instance এর মাধ্যমে কিভাবে লারাভেল সেশনে access করা যায় সেটি দেখি, আর এটি করতে হলে, আপনাকে একটি route closure বা controller method এ Request instance এর type-hint সুবিধা ব্যবহার করতে হবে। মনে রাখবেন, controller method dependency গুলো স্বয়ংক্রিয়ভাবে Laravel service container এর মাধ্যমে মাধ্যমে ইনজেক্ট করা হয়:
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class UserController extends Controller { /** * Show the profile for the given user. * * @param Request $request * @param int $id * @return Response */ public function show(Request $request, $id) { $value = $request->session()->get('key'); // } }
আপনি সেশন থেকে একটি আইটেম retrieve করার সময়, প্রয়োজনে get method এর মধ্যে second argument হিসাবে একটি default value পাস করতে পারেন। লারাভেল সেশনে আপনার retrieve করতে চাওয়া নির্দিষ্ট key টি যদি বিদ্যমান না থাকে , তাহলে এই ডিফল্ট ভ্যালু টি return হবে । আপনি যদি get পদ্ধতিতে ডিফল্ট মান হিসাবে একটি closure পাস করেন এবং রিকোয়েস্ট করা key টি যদি বিদ্যমান না থাকে, তাহলে closure টি executed হবে এবং executed এর result রিটার্ন হবে :
$value = $request->session()->get('key', 'default'); $value = $request->session()->get('key', function () { return 'default'; });
The Global Session Helper
আপনি সেশনে ডেটা retrieve এবং সংরক্ষণ করতে global session পিএইচপি ফাংশন ব্যবহার করতে পারেন। যখন session helper কে একটি একক, স্ট্রিং আর্গুমেন্টের সাথে কল করা হয়, তখন এটি সেই সেশন key টির value return দেবে। যখন helper key / value pairs অ্যারের সাথে ডাকা হয়, তখন সেই মানগুলি সেশনে সংরক্ষণ করা হবে:
Route::get('/home', function () { // Retrieve a piece of data from the session... $value = session('key'); // Specifying a default value... $value = session('key', 'default'); // Store a piece of data in the session... session(['key' => 'value']); });
Retrieving All Session Data
আপনি যদি সেশনের সমস্ত ডেটা retrieve করতে চান, তাহলে আপনি all method ব্যবহার করতে পারেন:
$data = $request->session()->all();
Determining If An Item Exists In The Session
Laravel Session এ একটি আইটেম উপস্থিত আছে কিনা তা নির্ধারণ করতে, আপনি has method ব্যবহার করতে পারেন। যদি আইটেমটি উপস্থিত থাকে এবং শূন্য না হয় তবে has method টি true return দিবে:
if ($request->session()->has('users')) { // }
এছাড়াও লারাভেল সেশনে একটি আইটেম উপস্থিত আছে কিনা তা নির্ধারণ করতে, এমনকি এর value শূন্য হলেও, আপনি exists method টি ব্যবহার করতে পারেন:
if ($request->session()->exists('users')) { // }
সেশনে একটি আইটেম উপস্থিত নাই, সেটি নিশ্চিত করতে, আপনি missing method ব্যবহার করতে পারেন। আইটেমটি শূন্য হলে বা আইটেমটি উপস্থিত না থাকলে missing method টি true রিটার্ন করে:
if ($request->session()->missing('users')) { // }
Storing Data
লারাভেল সেশনে ডেটা সংরক্ষণ করতে, আপনি request instance এর put method অথবা global session helper ব্যবহার করতে পারেন :
// Via a request instance... $request->session()->put('key', 'value'); // Via the global "session" helper... session(['key' => 'value']);
Pushing To Array Session Values
push method টি একটি session value এর উপর একটি নতুন value push করতে ব্যবহার করা যেতে পারে যা একটি array. উদাহরণস্বরূপ, যদি user.teams key টিতে team name নামের একটি array থাকে, তাহলে আপনি অ্যারেতে একটি নতুন value push করতে পারেন:
$request->session()->push('user.teams', 'developers');
Retrieving & Deleting An Item
pull method এর মাধ্যমে একটি single statement সেশন থেকে একটি item retrieve বা Delete এর কাজে ব্যবহার করতে পারেন।
$value = $request->session()->pull('key', 'default');
Incrementing & Decrementing Session Values
যদি আপনার session data তে একটি integer থাকে যা আপনি increment বা decrement করতে চান, আপনি increment() এবং decrement() method ব্যবহার করতে পারেন:
$request->session()->increment('count'); $request->session()->increment('count', $incrementBy = 2); $request->session()->decrement('count'); $request->session()->decrement('count', $decrementBy = 2);
Identifying the active Navigation using Laravel Session
Laravel Session ব্যবহার করে একটি Navigation লিস্টের এই মুহূর্তে কোন মেনু বা পেজ একটিভ আছে , তা আমরা খুব সহজেই নির্ণয় করতে পারি। আর এই কাজটি করার জন্য প্রথমে আমরা নিম্নোক্ত তিনটি তৈরি করে ফেলব:
php artisan make:controller HomeController php artisan make:controller AboutUsController php artisan make:controller ContactUsController
Adding a session during each Controller Action
এবার আমরা প্রতিটি controller action এর জন্য একটি করে session যোগ করব। নিচের মতো করে প্রতিটি Controller এর index method এ Session::put() Method ব্যবহার করে activeNav key তে একটি করে পেজ এর নাম সেশনে যুক্ত করব, এবং রিটার্ন হিসেবে একটি view page রিটার্ন করব :
HomeController
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Session; // We added for our Session() Helper Method class HomeController extends Controller { public function index() { Session::put('activeNav', 'home'); return view('home'); } }
AboutUsController
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Session; // We added for our Session() Helper Method class AboutUsController extends Controller { public function index() { Session::put('activeNav', 'about'); return view('about-us'); } }
ContactUsController
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Session; // We added for our Session() Helper Method class ContactUsController extends Controller { public function index() { Session::put('activeNav', 'contact'); return view('contact-us'); } }
এইবার আপনার লারাভেল প্রজেক্টে resources\views\layouts এর মধ্যে master.blade.php নামের ফাইলে নিচের কোডগুলো রাখুন :
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>@yield('title')</title> <script src="https://cdn.tailwindcss.com"></script> </head> <body class="bg-gray-200"> @include('partials.navbar') <div class="container mx-auto"> @yield('content') </div> </body> </html>
এইবার resources\views\partials এর মধ্যে navbar.blade.php নামের ফাইলে নিচের কোডগুলো রাখুন :
<div class="bg-purple-700 mb-8"> <div class="container mx-auto"> <div class="flex items-center"> <a class="block px-8 py-4 text-white {{ session('activeNav') === 'home' ? 'bg-purple-800' : null }}" href="{{ route('home') }}">Home</a> <a class="block px-8 py-4 text-white {{ session('activeNav') === 'about' ? 'bg-purple-800' : null }}" href="{{ route('about-us') }}">About Us</a> <a class="block px-8 py-4 text-white {{ session('activeNav') === 'contact' ? 'bg-purple-800' : null }}" href="{{ route('contact-us') }}">Contact Us</a> </div> </div> </div>
এইবার resources\views\ ফোল্ডারের মধ্যে home, about-us এবং contact-us blade ফাইল গুলো তৈরি করে ফেলব :
home.blade.php
@extends('layouts.master') @section('title', 'Welcome to Home Page') @section('content') <div> Home Page </div> @endsection
about-us.blade.php
@extends('layouts.master') @section('title', 'About Us') @section('content') <div> About Us Page </div> @endsection
contact-us.blade.php
@extends('layouts.master') @section('title', 'Contact Us') @section('content') <div> Contact Us Page </div> @endsection
এইবার routes/web.php তে নিচের মতকরে route গুলো ডিফাইন করে দিন :
use App\Http\Controllers\HomeController; use App\Http\Controllers\AboutUsController; use App\Http\Controllers\ContactUsController; Route::get('/', [HomeController::class, 'index'])->name('home'); Route::get('about-us', [AboutUsController::class, 'index'])->name('about-us'); Route::get('contact-us', [ContactUsController::class, 'index'])->name('contact-us');
এখন যদি আপনি আপনার route গুলোতে ভিজিট করেন , তাহলে নিচের মতো Current Menu টি একটিভ পাবেন:
Flash Session Data
কখনও কখনও আপনি পরবর্তী request এর জন্য session item গুলি store করতে চাইতে পারেন। এর জন্য আপনি flash method ব্যবহার করে তা করতে পারেন। এই method টি ব্যবহার করে সেশনে সংরক্ষিত ডেটা অবিলম্বে এবং পরবর্তী HTTP request এর সময় available হবে। পরবর্তী HTTP request এর পরে, ফ্ল্যাশ করা ডেটা ডিলিট করে ফেলা হবে। ফ্ল্যাশ ডেটা প্রাথমিকভাবে সাময়িক status message গুলির জন্য উপকারী:
$request->session()->flash('status', 'Task was successful!');
আপনি যদি একাধিক requests এর জন্য আপনার flash data ধরে রাখতে চান, আপনি reflash method ব্যবহার করতে পারেন, যা additional request এর জন্য সমস্ত flash data রাখবে। আপনার যদি শুধুমাত্র specific flash data রাখতে হয়, তাহলে আপনি Keep method ব্যবহার করতে পারেন:
$request->session()->reflash(); $request->session()->keep(['username', 'email']);
শুধুমাত্র current request এর জন্য আপনার ফ্ল্যাশ ডেটা বজায় রাখতে চান, তাহলে আপনি now method টি ব্যবহার করতে পারেন:
$request->session()->now('status', 'Task was successful!');
Deleting Session Data
forget method এর মাধ্যমে আপনি session থেকে ডেটার কিছু অংশ মুছে ফেলতে পারেন । আপনি যদি সেশন থেকে সমস্ত ডেটা মুছে ফেলতে চান তবে আপনি flush method ব্যবহার করতে পারেন:
// Forget a single key... $request->session()->forget('name'); // Forget multiple keys... $request->session()->forget(['name', 'status']); $request->session()->flush();
Regenerating The Laravel Session ID
session ID কে Regenerating এর মাধ্যমে আপনি malicious ইউজারদের থেকে আপনার অ্যাপ্লিকেশকে session fixation attack থেকে বাঁচাতে পারেন।
আপনি যদি Laravel application starter kits বা Laravel Fortify এর মধ্যে যেকোনো একটি ব্যবহার করেন তাহলে authentication এর সময় Laravel স্বয়ংক্রিয়ভাবে session ID regenerate করে; যাইহোক, যদি আপনাকে সেশন আইডি ম্যানুয়ালি regenerate করতে হয়, আপনি regenerate method ব্যবহার করতে পারেন:
$request->session()->regenerate();
আপনি যদি session ID regenerate করতে চান এবং একটি single statement এর মাধ্যম সেশন থেকে সমস্ত ডেটা remove চান তবে আপনি invalidate method ব্যবহার করতে পারেন:
$request->session()->invalidate();