<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ruhul Amin Sujon</title>
    <description>The latest articles on DEV Community by Ruhul Amin Sujon (@ruhul_aminsujon_f65b3678).</description>
    <link>https://dev.to/ruhul_aminsujon_f65b3678</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2676242%2F8c22faef-04f3-4ba7-b950-e176d872691d.png</url>
      <title>DEV Community: Ruhul Amin Sujon</title>
      <link>https://dev.to/ruhul_aminsujon_f65b3678</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ruhul_aminsujon_f65b3678"/>
    <language>en</language>
    <item>
      <title>ব্যাকএন্ড ইঞ্জিনিয়ারের জন্য সিস্টেম ডিজাইন শেখা</title>
      <dc:creator>Ruhul Amin Sujon</dc:creator>
      <pubDate>Tue, 10 Mar 2026 21:48:42 +0000</pubDate>
      <link>https://dev.to/ruhul_aminsujon_f65b3678/byaakendd-inyjiniyaarer-jny-sisttem-ddijaain-shekhaa-fim</link>
      <guid>https://dev.to/ruhul_aminsujon_f65b3678/byaakendd-inyjiniyaarer-jny-sisttem-ddijaain-shekhaa-fim</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;em&gt;Q:1&lt;/em&gt;&lt;/strong&gt;- System Design (scalability, microservices)&lt;br&gt;
&lt;strong&gt;Answer&lt;/strong&gt;:&lt;br&gt;
🏗️ &lt;strong&gt;System Design কী?&lt;/strong&gt;&lt;br&gt;
System Design হলো এমন একটি প্রক্রিয়া যেখানে আপনি একটি বড় সফটওয়্যার সিস্টেমের &lt;strong&gt;আর্কিটেকচার, কম্পোনেন্ট, এবং ডেটা ফ্লো&lt;/strong&gt; পরিকল্পনা করেন — যাতে সিস্টেমটি &lt;strong&gt;লক্ষ লক্ষ ইউজার&lt;/strong&gt; হ্যান্ডেল করতে পারে, &lt;strong&gt;ক্র্যাশ না করে&lt;/strong&gt;, এবং &lt;strong&gt;দ্রুত রেসপন্স&lt;/strong&gt; দিতে পারে।&lt;br&gt;
&lt;strong&gt;সহজ কথায়&lt;/strong&gt;: আপনার অ্যাপ যখন ১০০ ইউজার থেকে ১০ মিলিয়ন ইউজারে যায় — তখন কী করবেন, সেটাই System Design।&lt;/p&gt;



&lt;p&gt;📐 &lt;strong&gt;১. Scalability (স্কেলেবিলিটি)&lt;/strong&gt;&lt;br&gt;
Scalability মানে হলো আপনার সিস্টেম &lt;strong&gt;বেশি লোড&lt;/strong&gt; আসলে সেটা &lt;strong&gt;সামলাতে পারে&lt;/strong&gt; কিনা।&lt;br&gt;
&lt;strong&gt;দুই ধরনের Scaling আছে:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Vertical Scaling (Scale Up)&lt;/strong&gt;&lt;br&gt;
মানে আপনার সার্ভারের শক্তি বাড়ানো — বেশি RAM, বেশি CPU। কিন্তু এর একটা সীমা আছে এবং এটা ব্যয়বহুল।&lt;br&gt;
&lt;strong&gt;Horizontal Scaling (Scale Out)&lt;/strong&gt;&lt;br&gt;
মানে একটা সার্ভারের বদলে অনেকগুলো সার্ভার ব্যবহার করা। Laravel-এ এটাই বেশি প্র্যাক্টিক্যাল।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[User] → [Load Balancer] → [Server 1]
                        → [Server 2]  
                        → [Server 3]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Laravel-এ Horizontal Scaling এর জন্য যা করতে হবে:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;১. Session Shared করুন&lt;/strong&gt; — একাধিক সার্ভারে session share করতে Redis ব্যবহার করুন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// .env&lt;/span&gt;
&lt;span class="no"&gt;SESSION_DRIVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;redis&lt;/span&gt;
&lt;span class="no"&gt;CACHE_DRIVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;redis&lt;/span&gt;

&lt;span class="c1"&gt;// config/session.php&lt;/span&gt;
&lt;span class="s1"&gt;'driver'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'SESSION_DRIVER'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'redis'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;২. File Storage Centralize করুন&lt;/strong&gt; — সব সার্ভার যেন একই জায়গা থেকে ফাইল পায়:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// config/filesystems.php&lt;/span&gt;
&lt;span class="s1"&gt;'default'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'FILESYSTEM_DISK'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'s3'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;

&lt;span class="s1"&gt;'disks'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'s3'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'driver'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'s3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'key'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'AWS_ACCESS_KEY_ID'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s1"&gt;'secret'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'AWS_SECRET_ACCESS_KEY'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s1"&gt;'region'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'AWS_DEFAULT_REGION'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s1"&gt;'bucket'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'AWS_BUCKET'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;৩. Queue Centralize করুন&lt;/strong&gt; — Jobs যেন যেকোনো সার্ভার প্রসেস করতে পারে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// .env&lt;/span&gt;
&lt;span class="no"&gt;QUEUE_CONNECTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;redis&lt;/span&gt;

&lt;span class="c1"&gt;// Job dispatch করুন&lt;/span&gt;
&lt;span class="nc"&gt;ProcessOrder&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;onQueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'orders'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// যেকোনো সার্ভারে worker চালান&lt;/span&gt;
&lt;span class="n"&gt;php&lt;/span&gt; &lt;span class="n"&gt;artisan&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🔄 &lt;strong&gt;২. Scalability Patterns&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;ক) Database Read/Write Separation&lt;/strong&gt;&lt;br&gt;
বেশিরভাগ অ্যাপে &lt;strong&gt;৮০% Read, ২০% Write&lt;/strong&gt; অপারেশন হয়। তাই Read আলাদা সার্ভারে পাঠানো স্মার্ট।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// config/database.php&lt;/span&gt;
&lt;span class="s1"&gt;'mysql'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'read'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'host'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DB_READ_HOST_1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'192.168.1.2'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DB_READ_HOST_2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'192.168.1.3'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s1"&gt;'write'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'host'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DB_WRITE_HOST'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'192.168.1.1'&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s1"&gt;'driver'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'mysql'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'database'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DB_DATABASE'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'myapp'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s1"&gt;'username'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DB_USERNAME'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'root'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s1"&gt;'password'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DB_PASSWORD'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এখন Laravel নিজেই SELECT কে Read সার্ভারে এবং INSERT/UPDATE/DELETE কে Write সার্ভারে পাঠাবে।&lt;br&gt;
&lt;strong&gt;খ) Caching Layer&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// ডাটাবেজে বারবার না গিয়ে Cache থেকে নিন&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getPopularProducts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'popular_products'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'is_popular'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                      &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                      &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                      &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;গ) Queue দিয়ে Heavy Tasks আলাদা করুন&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// ❌ ভুল — Request এর মধ্যেই Heavy কাজ করা&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="nc"&gt;Mail&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WelcomeMail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// এটা slow!&lt;/span&gt;
    &lt;span class="nc"&gt;Notification&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SmsNotification&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// এটাও slow!&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'success'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ✅ সঠিক — Queue এ পাঠিয়ে দিন&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="nc"&gt;SendWelcomeEmail&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// Background এ যাবে&lt;/span&gt;
    &lt;span class="nc"&gt;SendWelcomeSms&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;     &lt;span class="c1"&gt;// Background এ যাবে&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'success'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// তৎক্ষণাৎ রেসপন্স&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🧩 &lt;strong&gt;৩. Microservices Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Microservices মানে একটা বড় অ্যাপকে &lt;strong&gt;ছোট ছোট স্বাধীন সার্ভিসে&lt;/strong&gt; ভাগ করা — যেগুলো আলাদাভাবে deploy ও scale করা যায়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monolith vs Microservices:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;❌ &lt;strong&gt;Monolith (একটাই বড় অ্যাপ)&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[User, Product, Order, Payment, Notification] → একটা Laravel App
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Microservices (আলাদা আলাদা সার্ভিস)&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[User Service]        → api.myapp.com/users
[Product Service]     → api.myapp.com/products  
[Order Service]       → api.myapp.com/orders
[Payment Service]     → api.myapp.com/payments
[Notification Service]→ api.myapp.com/notifications
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Microservices কখন দরকার?&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;আপনার অ্যাপ যদি এরকম হয়&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;টিম বড় এবং আলাদা আলাদা টিম আলাদা ফিচারে কাজ করে&lt;/li&gt;
&lt;li&gt;কিছু সার্ভিস বেশি scale দরকার (যেমন Payment আলাদা scale)&lt;/li&gt;
&lt;li&gt;Different technology দরকার বিভিন্ন অংশে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Laravel-এ Microservices — Service Communication:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;HTTP দিয়ে সার্ভিস কল করুন (Guzzle/Http Facade):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// Order Service থেকে Product Service কে কল করা&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;createOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Product Service এ চেক করুন stock আছে কিনা&lt;/span&gt;
        &lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Http&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;withToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'services.product.token'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'services.product.url'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/api/products/'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'product_id'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;successful&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ServiceUnavailableException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Product service unreachable'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'stock'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'quantity'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InsufficientStockException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Not enough stock'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Order তৈরি করুন&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="s1"&gt;'user_id'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'user_id'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="s1"&gt;'product_id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'product_id'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="s1"&gt;'quantity'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'quantity'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="s1"&gt;'total'&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'price'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'quantity'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Event-Driven Communication (RabbitMQ/Redis):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// Order Service — Event Publish করছে&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderController&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Controller&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;validated&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

        &lt;span class="c1"&gt;// Notification Service কে জানাও — সরাসরি কল না করে Event দিয়ে&lt;/span&gt;
        &lt;span class="nf"&gt;event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OrderCreated&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

        &lt;span class="c1"&gt;// অথবা Redis Pub/Sub দিয়ে&lt;/span&gt;
        &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'order.created'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="s1"&gt;'order_id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'user_id'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'total'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;]));&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Notification Service — Event Subscribe করছে&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderCreatedListener&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;OrderCreated&lt;/span&gt; &lt;span class="nv"&gt;$event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Email পাঠাও&lt;/span&gt;
        &lt;span class="nc"&gt;Mail&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$event&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OrderConfirmationMail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$event&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🚦 &lt;strong&gt;৪. API Gateway Pattern&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Microservices এ সব সার্ভিস আলাদা থাকলে Client কে একটাই Entry Point দেওয়া হয় — এটাই &lt;strong&gt;API Gateway&lt;/strong&gt;।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Mobile App]  ──┐
[Web App]     ──┤──→ [API Gateway] ──→ [User Service]
[Third Party] ──┘         │        ──→ [Product Service]
                          │        ──→ [Order Service]
                    (Auth, Rate Limit,
                     Logging, Routing)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Laravel-এ Simple API Gateway বানানো:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// routes/api.php — Gateway হিসেবে কাজ করবে&lt;/span&gt;
&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'auth:sanctum'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'throttle:100,1'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// User Service এ forward করুন&lt;/span&gt;
    &lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/users/{path?}'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Http&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;withToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;bearerToken&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
                   &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;method&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                          &lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'services.user.url'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'json'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()]);&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'path'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.*'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Product Service এ forward করুন  &lt;/span&gt;
    &lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/products/{path?}'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Http&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;method&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                          &lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'services.product.url'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'json'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()]);&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'path'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.*'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;📊 &lt;strong&gt;৫. Real-world System Design Example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ধরুন আপনাকে একটা E-commerce সিস্টেম ডিজাইন করতে বলা হলো যেখানে ১০ লক্ষ ইউজার থাকবে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌─────────────────────────────┐
                    │         CDN (CloudFront)     │  ← Static files, Images
                    └──────────────┬──────────────┘
                                   │
                    ┌──────────────▼──────────────┐
                    │      Load Balancer (Nginx)   │  ← Traffic distribute
                    └──────┬───────────┬───────────┘
                           │           │
              ┌────────────▼─┐    ┌────▼────────────┐
              │  Laravel App │    │  Laravel App     │  ← Multiple instances
              │  (Server 1)  │    │  (Server 2)      │
              └──────┬───────┘    └────┬─────────────┘
                     │                 │
        ┌────────────▼─────────────────▼────────────┐
        │                                            │
   ┌────▼────┐    ┌──────────┐    ┌───────────────┐  │
   │  Redis  │    │  MySQL   │    │  Elasticsearch│  │
   │ (Cache/ │    │ (Master) │    │  (Search)     │  │
   │  Queue/ │    │    │     │    └───────────────┘  │
   │ Session)│    │ Replica  │                        │
   └─────────┘    │ (Read)   │    ┌───────────────┐  │
                  └──────────┘    │  S3 (Storage) │  │
                                  └───────────────┘  │
        └────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;এই ডিজাইনের প্রতিটা অংশের কাজ:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;CDN&lt;/strong&gt; — Images, CSS, JS ক্যাশ করে রাখে, সার্ভারে চাপ কমায়।&lt;br&gt;
&lt;strong&gt;Load Balancer&lt;/strong&gt; — Request গুলো Server 1 ও Server 2 এ ভাগ করে দেয়।&lt;br&gt;
&lt;strong&gt;Redis&lt;/strong&gt; — Session, Cache এবং Queue — তিনটাই হ্যান্ডেল করে।&lt;br&gt;
&lt;strong&gt;MySQL Master-Replica&lt;/strong&gt; — Master Write করে, Replica Read করে।&lt;br&gt;
&lt;strong&gt;Elasticsearch&lt;/strong&gt; — Product search দ্রুত করে।&lt;br&gt;
&lt;strong&gt;S3&lt;/strong&gt; — User uploaded files রাখে।&lt;/p&gt;



&lt;p&gt;🎯 &lt;strong&gt;৬. Scalability Best Practices — Laravel এ&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// ১. N+1 Query সমস্যা দূর করুন&lt;/span&gt;
&lt;span class="c1"&gt;// ❌ ভুল — প্রতিটা order এর জন্য আলাদা query&lt;/span&gt;
&lt;span class="nv"&gt;$orders&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$orders&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// প্রতিবার DB hit!&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ✅ সঠিক — Eager Loading ব্যবহার করুন&lt;/span&gt;
&lt;span class="nv"&gt;$orders&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'user'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'products'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'payment'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// ২. Pagination ব্যবহার করুন — সব data একসাথে না নিয়ে&lt;/span&gt;
&lt;span class="c1"&gt;// ❌ ভুল&lt;/span&gt;
&lt;span class="nv"&gt;$products&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// ১০ লক্ষ row!&lt;/span&gt;

&lt;span class="c1"&gt;// ✅ সঠিক&lt;/span&gt;
&lt;span class="nv"&gt;$products&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;paginate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ৩. Chunk দিয়ে বড় ডেটা প্রসেস করুন&lt;/span&gt;
&lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$products&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$products&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// প্রতি ১০০০টা করে process হবে, memory overflow হবে না&lt;/span&gt;
        &lt;span class="nc"&gt;ProcessProduct&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// ৪. Database Index ব্যবহার করুন&lt;/span&gt;
&lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'orders'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Blueprint&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'user_id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;      &lt;span class="c1"&gt;// Composite Index&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'created_at'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;               &lt;span class="c1"&gt;// Date filter এর জন্য&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// ৫. Rate Limiting — অতিরিক্ত Request ঠেকান&lt;/span&gt;
&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'throttle:60,1'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/products'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;ProductController&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'index'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🛡️ &lt;strong&gt;৭. Fault Tolerance — সিস্টেম যেন ক্র্যাশ না করে&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// Circuit Breaker Pattern — একটা সার্ভিস বন্ধ হলে পুরো সিস্টেম যেন না পড়ে&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PaymentService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;processPayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Order&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Http&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// ৫ সেকেন্ডের বেশি অপেক্ষা না করা&lt;/span&gt;
                            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// ৩ বার try, ১ সেকেন্ড পরপর&lt;/span&gt;
                            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'https://payment-gateway.com/api/charge'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                                &lt;span class="s1"&gt;'amount'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                &lt;span class="s1"&gt;'currency'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'BDT'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                            &lt;span class="p"&gt;]);&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;// Fallback — alternative payment method try করুন&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;processWithAlternativeGateway&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ConnectionException&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Gateway down — Queue তে রাখুন পরে retry করার জন্য&lt;/span&gt;
            &lt;span class="nc"&gt;RetryPayment&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addMinutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
            &lt;span class="nc"&gt;Log&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Payment gateway down'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'order_id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PaymentGatewayException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Payment will be processed shortly'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;📝 &lt;strong&gt;সংক্ষেপে মনে রাখুন&lt;/strong&gt;&lt;br&gt;
System Design এর মূল বিষয়গুলো হলো — &lt;strong&gt;Scalability&lt;/strong&gt; মানে বেশি লোড সামলানোর ক্ষমতা (Horizontal &amp;gt; Vertical), &lt;strong&gt;Microservices&lt;/strong&gt; মানে বড় সিস্টেমকে ছোট ছোট স্বাধীন সার্ভিসে ভাগ করা, &lt;strong&gt;Caching&lt;/strong&gt; মানে ডাটাবেজে বারবার না গিয়ে দ্রুত ডেটা দেওয়া, &lt;strong&gt;Queue&lt;/strong&gt; মানে ভারী কাজ Background এ করা, এবং &lt;strong&gt;Fault Tolerance&lt;/strong&gt; মানে এক অংশ ভাঙলেও বাকি সিস্টেম চালু রাখা।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Q:2&lt;/em&gt;&lt;/strong&gt; - &lt;strong&gt;APIs (REST, GraphQL, gRPC)&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Answer&lt;/em&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;API কী?&lt;/strong&gt;&lt;br&gt;
API (Application Programming Interface) হলো দুটো সফটওয়্যারের মধ্যে &lt;strong&gt;কথা বলার নিয়ম&lt;/strong&gt;। যেমন — আপনার Laravel অ্যাপ যখন Mobile App কে ডেটা দেয়, সেটা API এর মাধ্যমে হয়।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Mobile App] ←──── API ────→ [Laravel Backend] ←──→ [Database]
[Web App]    ←──── API ────→ [Laravel Backend]
[Third Party]←──── API ────→ [Laravel Backend]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;তিনটা প্রধান API টাইপ আছে — &lt;strong&gt;REST, GraphQL, এবং gRPC&lt;/strong&gt;। প্রতিটার আলাদা সুবিধা ও ব্যবহার আছে।&lt;/p&gt;




&lt;p&gt;🔵 &lt;strong&gt;PART 1 — REST API&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;REST API কী?&lt;/strong&gt;&lt;br&gt;
REST (Representational State Transfer) হলো সবচেয়ে জনপ্রিয় API স্টাইল। এটা &lt;strong&gt;HTTP Methods&lt;/strong&gt; ব্যবহার করে ডেটা আদান-প্রদান করে।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET    /api/products        → সব product দেখাও
GET    /api/products/5      → ৫ নম্বর product দেখাও
POST   /api/products        → নতুন product তৈরি করো
PUT    /api/products/5      → ৫ নম্বর product সম্পূর্ণ আপডেট করো
PATCH  /api/products/5      → ৫ নম্বর product আংশিক আপডেট করো
DELETE /api/products/5      → ৫ নম্বর product মুছে ফেলো
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Laravel-এ Professional REST API বানানো&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Step 1 — Route তৈরি করুন:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// routes/api.php&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\Http\Controllers\Api\V1\ProductController&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// API Versioning — v1, v2 আলাদা রাখুন&lt;/span&gt;
&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'v1'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// Public routes — Auth লাগবে না&lt;/span&gt;
    &lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/products'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;ProductController&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'index'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/products/{id}'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;ProductController&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'show'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

    &lt;span class="c1"&gt;// Protected routes — Auth লাগবে&lt;/span&gt;
    &lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'auth:sanctum'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/products'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;ProductController&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'store'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
        &lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/products/{id}'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;ProductController&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'update'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
        &lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/products/{id}'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;ProductController&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'destroy'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2 — Form Request দিয়ে Validation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// app/Http/Requests/Api/StoreProductRequest.php&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;StoreProductRequest&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;FormRequest&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'name'&lt;/span&gt;        &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'required|string|max:255'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'price'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'required|numeric|min:0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'stock'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'required|integer|min:0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'category_id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'required|exists:categories,id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'description'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'nullable|string|max:1000'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'name.required'&lt;/span&gt;        &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'পণ্যের নাম দিতে হবে'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'price.required'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'দাম দিতে হবে'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'category_id.exists'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'ক্যাটাগরি সঠিক নয়'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3 — API Resource দিয়ে Response Format করুন:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// app/Http/Resources/ProductResource.php&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductResource&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;JsonResource&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;toArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'id'&lt;/span&gt;          &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'name'&lt;/span&gt;        &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'price'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;number_format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="s1"&gt;'price_bdt'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'৳ '&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nb"&gt;number_format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="s1"&gt;'stock'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'in_stock'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'category'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CategoryResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;whenLoaded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
            &lt;span class="s1"&gt;'images'&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;ImageResource&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;whenLoaded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'images'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
            &lt;span class="s1"&gt;'created_at'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'d M Y'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;

            &lt;span class="c1"&gt;// Condition — শুধু Admin দেখবে&lt;/span&gt;
            &lt;span class="s1"&gt;'cost_price'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;when&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                                &lt;span class="nf"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;user&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;isAdmin&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                                &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;cost_price&lt;/span&gt;
                             &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Collection Resource&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductCollection&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;ResourceCollection&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;toArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'data'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'meta'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="s1"&gt;'total_products'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;total&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                &lt;span class="s1"&gt;'current_page'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;currentPage&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4 — Controller লিখুন:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// app/Http/Controllers/Api/V1/ProductController.php&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductController&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Controller&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$products&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'images'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;when&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
                &lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'like'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"%&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;%"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;when&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;category_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
                &lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'category_id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;category_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;when&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;min_price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
                &lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'price'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&amp;gt;='&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;min_price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;latest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;paginate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;per_page&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;ProductResource&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$products&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;StoreProductRequest&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;validated&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ProductResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setStatusCode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 201 Created&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'images'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'reviews'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                          &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;findOrFail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ProductResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;UpdateProductRequest&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;findOrFail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;validated&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ProductResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;destroy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;findOrFail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="s1"&gt;'message'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Product deleted successfully'&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 5 — Global Exception Handler (সুন্দর Error Response):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// app/Exceptions/Handler.php&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;register&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;renderable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Throwable&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;expectsJson&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

            &lt;span class="c1"&gt;// Validation Error&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$e&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nc"&gt;ValidationException&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                    &lt;span class="s1"&gt;'success'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s1"&gt;'message'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Validation failed'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s1"&gt;'errors'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;422&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="c1"&gt;// Not Found&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$e&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nc"&gt;ModelNotFoundException&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                    &lt;span class="s1"&gt;'success'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s1"&gt;'message'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Resource not found'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="c1"&gt;// Unauthorized&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$e&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nc"&gt;AuthenticationException&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                    &lt;span class="s1"&gt;'success'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s1"&gt;'message'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Unauthenticated. Please login first.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="c1"&gt;// Server Error&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                &lt;span class="s1"&gt;'success'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s1"&gt;'message'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Something went wrong'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s1"&gt;'debug'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'app.debug'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;REST API Response Structure — Best Practice:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;✅&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Success&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Response&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Products fetched successfully"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"iPhone 15"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1,200.00"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"meta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"per_page"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"current_page"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;✅&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Error&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Response&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Validation failed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"errors"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"পণ্যের নাম দিতে হবে"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"দাম দিতে হবে"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🟠 &lt;strong&gt;PART 2 — GraphQL API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GraphQL কী এবং কেন REST থেকে আলাদা?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;REST এ সমস্যা হলো&lt;/strong&gt; — &lt;strong&gt;Over-fetching&lt;/strong&gt; (বেশি ডেটা আসে) এবং &lt;strong&gt;Under-fetching&lt;/strong&gt; (কম ডেটা আসে, আবার call করতে হয়)।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ REST এর সমস্যা:
GET /api/users/1  → পুরো user object আসে (name, email, phone, address, ...)
                    কিন্তু আমার শুধু name দরকার ছিল!

GET /api/users/1  → user আসে, কিন্তু তার orders নেই
GET /api/users/1/orders → আবার আলাদা call করতে হলো!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;GraphQL এর সমাধান:&lt;/strong&gt;&lt;br&gt;
যা চাইবেন, ঠিক তাই পাবেন — এক request এ!&lt;br&gt;
&lt;strong&gt;Laravel-এ GraphQL Setup (Lighthouse)&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bash
composer require nuwave/lighthouse
php artisan vendor:publish &lt;span class="nt"&gt;--tag&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;lighthouse-schema
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Schema Define করুন&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="err"&gt;graphql&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# graphql/schema.graphql&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="c"&gt;# Single product&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Product&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="c"&gt;# Product list with filtering &amp;amp; pagination&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="n"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="n"&gt;like&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;category_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;eq&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;min_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Float&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;"&amp;gt;="&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;!]!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;paginate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;defaultCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;15)&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="c"&gt;# Current logged in user&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;me&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Mutation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;createProduct&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CreateProductInput&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;spread&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Product&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="n"&gt;sanctum&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="n"&gt;updateProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;UpdateProductInput&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;spread&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Product&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="n"&gt;sanctum&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="n"&gt;deleteProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!):&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Product&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="n"&gt;sanctum&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Types&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Product&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;in_stock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="n"&gt;isInStock&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Category&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;belongsTo&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;images&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;!]!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;hasMany&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;reviews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Review&lt;/span&gt;&lt;span class="p"&gt;!]!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;hasMany&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;!]!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;hasMany&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Category&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;!]!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;hasMany&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Input Types&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="k"&gt;input&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CreateProductInput&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;category_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;input&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;UpdateProductInput&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Float&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Int&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;GraphQL Query — Client থেকে এভাবে request করবেন:&lt;/strong&gt;&lt;br&gt;
graphql&lt;br&gt;
&lt;code&gt;শুধু দরকারি field নিন&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;GetProduct&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ফলাফল — শুধু যা চেয়েছেন তাই আসবে:&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"product"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"iPhone 15"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1200.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Electronics"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;একসাথে অনেক কিছু নিন — একটাই Request!&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;GetDashboard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;me&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;paginatorInfo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="n"&gt;currentPage&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Mutation — Data তৈরি করুন&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;mutation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CreateProduct&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;createProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Samsung Galaxy S24"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;999.99&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;category_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Custom Resolver — Complex Logic এর জন্য:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// app/GraphQL/Queries/ProductSearch.php&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductSearch&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;when&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'search'&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
                &lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'like'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"%&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'search'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;%"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                  &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;orWhere&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'description'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'like'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"%&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'search'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;%"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;when&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'min_price'&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
                &lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'price'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&amp;gt;='&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'min_price'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'images'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// app/GraphQL/Mutations/CreateOrder.php&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CreateOrder&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Stock চেক করুন&lt;/span&gt;
        &lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;lockForUpdate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;findOrFail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'product_id'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nv"&gt;$args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'quantity'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;\Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Insufficient stock available'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Transaction এ Order তৈরি করুন&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                &lt;span class="s1"&gt;'user_id'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                &lt;span class="s1"&gt;'product_id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s1"&gt;'quantity'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'quantity'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="s1"&gt;'total'&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;$args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'quantity'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;]);&lt;/span&gt;

            &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;decrement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'stock'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'quantity'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🟣 &lt;strong&gt;PART 3 — gRPC API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;gRPC কী?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;gRPC হলো Google এর তৈরি &lt;strong&gt;অত্যন্ত দ্রুত&lt;/strong&gt; API প্রোটোকল। এটা REST এর চেয়ে &lt;strong&gt;৫-১০ গুণ দ্রুত&lt;/strong&gt; কাজ করে। &lt;strong&gt;Microservices&lt;/strong&gt; এর মধ্যে communication এর জন্য এটা সেরা।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;REST  → JSON (Text) → HTTP/1.1   → ধীর, বড় size
gRPC  → Protobuf (Binary) → HTTP/2 → দ্রুত, ছোট size
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;কখন gRPC ব্যবহার করবেন?&lt;/strong&gt;&lt;br&gt;
যখন দুটো &lt;strong&gt;internal service&lt;/strong&gt; এর মধ্যে খুব দ্রুত এবং অনেক বেশি communication দরকার — যেমন Order Service থেকে Inventory Service কে প্রতি সেকেন্ডে হাজারবার call করতে হচ্ছে।&lt;br&gt;
&lt;strong&gt;Laravel-এ gRPC Setup:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bash
&lt;span class="c"&gt;# Protocol Buffer compiler install করুন&lt;/span&gt;
pecl &lt;span class="nb"&gt;install &lt;/span&gt;grpc
pecl &lt;span class="nb"&gt;install &lt;/span&gt;protobuf
composer require grpc/grpc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Proto File — API Contract Define করুন:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight protobuf"&gt;&lt;code&gt;&lt;span class="n"&gt;protobuf&lt;/span&gt;
&lt;span class="c1"&gt;// proto/product.proto&lt;/span&gt;
&lt;span class="na"&gt;syntax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"proto3"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;product&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Service Define&lt;/span&gt;
&lt;span class="kd"&gt;service&lt;/span&gt; &lt;span class="n"&gt;ProductService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;rpc&lt;/span&gt; &lt;span class="n"&gt;GetProduct&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ProductRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;returns&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ProductResponse&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;rpc&lt;/span&gt; &lt;span class="n"&gt;GetProducts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ProductsRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;returns&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ProductsResponse&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;rpc&lt;/span&gt; &lt;span class="n"&gt;CreateProduct&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CreateProductRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;returns&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ProductResponse&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;rpc&lt;/span&gt; &lt;span class="n"&gt;CheckStock&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StockRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;returns&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StockResponse&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Messages (REST এ JSON এর মতো)&lt;/span&gt;
&lt;span class="kd"&gt;message&lt;/span&gt; &lt;span class="nc"&gt;ProductRequest&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int32&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;message&lt;/span&gt; &lt;span class="nc"&gt;ProductResponse&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int32&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int32&lt;/span&gt; &lt;span class="na"&gt;stock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="na"&gt;in_stock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;message&lt;/span&gt; &lt;span class="nc"&gt;StockRequest&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int32&lt;/span&gt; &lt;span class="na"&gt;product_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int32&lt;/span&gt; &lt;span class="na"&gt;quantity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;message&lt;/span&gt; &lt;span class="nc"&gt;StockResponse&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="na"&gt;available&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int32&lt;/span&gt; &lt;span class="na"&gt;current_stock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="kd"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;message&lt;/span&gt; &lt;span class="nc"&gt;CreateProductRequest&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int32&lt;/span&gt; &lt;span class="na"&gt;stock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int32&lt;/span&gt; &lt;span class="na"&gt;category_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;gRPC Server (Product Service):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// app/Grpc/ProductServiceServer.php&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductServiceServer&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;ProductServiceInterface&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Product খুঁজে দিন&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;GetProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;ProductRequest&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]):&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getId&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ProductResponse&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                &lt;span class="nc"&gt;Status&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Code&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;NOT_FOUND&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Product not found'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ProductResponse&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setStock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setInStock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Status&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;()];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Stock চেক করুন&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;CheckStock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;StockRequest&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]):&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getProductId&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StockResponse&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setAvailable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setCurrentStock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Product not found'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;elseif&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getQuantity&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setAvailable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setCurrentStock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Stock available'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setAvailable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setCurrentStock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Only &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; items available"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Status&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;()];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;gRPC Client (Order Service থেকে Product Service কে call করা):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// app/Services/ProductGrpcClient.php&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductGrpcClient&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;ProductServiceClient&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Product Service এর address&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ProductServiceClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s1"&gt;'product-service:50051'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Internal DNS&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'credentials'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;ChannelCredentials&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;createInsecure&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;checkStock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$quantity&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StockRequest&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setProductId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setQuantity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$quantity&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;CheckStock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nc"&gt;Code&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;OK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;\Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'gRPC Error: '&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;details&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'available'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getAvailable&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="s1"&gt;'current_stock'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getCurrentStock&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="s1"&gt;'message'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Order Service এ ব্যবহার করুন&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderController&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Controller&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;ProductGrpcClient&lt;/span&gt; &lt;span class="nv"&gt;$productClient&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// gRPC দিয়ে Product Service কে call — অত্যন্ত দ্রুত!&lt;/span&gt;
        &lt;span class="nv"&gt;$stockInfo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$productClient&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;checkStock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$stockInfo&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'available'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                &lt;span class="s1"&gt;'message'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$stockInfo&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'message'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;422&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nv"&gt;$order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;validated&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;⚖️ &lt;strong&gt;REST vs GraphQL vs gRPC — কোনটা কখন?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────┬──────────────┬──────────────┬──────────────┐
│             │     REST     │   GraphQL    │     gRPC     │
├─────────────┼──────────────┼──────────────┼──────────────┤
│ সেরা ব্যবহার│ Public API   │ Complex UI   │ Microservice │
│             │              │ Mobile App   │ Internal API │
├─────────────┼──────────────┼──────────────┼──────────────┤
│ Speed       │ ⭐⭐⭐        │ ⭐⭐⭐        │ ⭐⭐⭐⭐⭐    │
├─────────────┼──────────────┼──────────────┼──────────────┤
│ শেখা সহজ   │ ✅ সহজ       │ মাঝামাঝি    │ ❌ কঠিন     │
├─────────────┼──────────────┼──────────────┼──────────────┤
│ Flexibility │ কম           │ ✅ অনেক বেশি│ কম          │
├─────────────┼──────────────┼──────────────┼──────────────┤
│ Browser     │ ✅ সরাসরি   │ ✅ সরাসরি   │ ❌ কঠিন     │
│ Support     │              │              │              │
└─────────────┴──────────────┴──────────────┴──────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Real Project এ কীভাবে ব্যবহার করবেন:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;আপনার E-commerce App:

REST API      → Third-party integration, Payment Gateway, Public API
GraphQL       → Mobile App, Web Dashboard (যেখানে flexible data দরকার)
gRPC          → Order Service ↔ Inventory Service (Internal fast communication)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🔐 &lt;strong&gt;API Security — সব API তে দরকার&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// ১. Rate Limiting — প্রতি মিনিটে সর্বোচ্চ কতবার call করা যাবে&lt;/span&gt;
&lt;span class="nc"&gt;RateLimiter&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'api'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Limit&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;perMinute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;by&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;user&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// ২. API Versioning — পুরনো clients ভাঙবে না&lt;/span&gt;
&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'v1'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// পুরনো version চলবে&lt;/span&gt;
&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'v2'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// নতুন version আলাদা&lt;/span&gt;

&lt;span class="c1"&gt;// ৩. Request Logging — কে কখন কী করলো&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ApiLoggingMiddleware&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Closure&lt;/span&gt; &lt;span class="nv"&gt;$next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nc"&gt;Log&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'api'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'API Request'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'method'&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;method&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="s1"&gt;'url'&lt;/span&gt;         &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;fullUrl&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="s1"&gt;'user_id'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="s1"&gt;'ip'&lt;/span&gt;          &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="s1"&gt;'status'&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getStatusCode&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="s1"&gt;'duration_ms'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nb"&gt;microtime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="no"&gt;LARAVEL_START&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;]);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ৪. Response Cache — একই request বারবার DB তে না গিয়ে&lt;/span&gt;
&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'cache.headers:public;max_age=3600;etag'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/products'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;ProductController&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'index'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📝 &lt;strong&gt;সংক্ষেপে মনে রাখুন&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;REST&lt;/strong&gt; হলো সবচেয়ে সহজ ও জনপ্রিয় — Public API এর জন্য সেরা। &lt;strong&gt;GraphQL&lt;/strong&gt; হলো Flexible — Mobile/Web App এ যখন কতটুকু ডেটা দরকার সেটা Client ঠিক করে। &lt;strong&gt;gRPC&lt;/strong&gt; হলো সবচেয়ে দ্রুত — Microservices এর internal communication এ সেরা।&lt;br&gt;
Laravel Backend Engineer হিসেবে &lt;strong&gt;REST অবশ্যই আয়ত্ত করুন&lt;/strong&gt;, তারপর &lt;strong&gt;GraphQL&lt;/strong&gt; শিখুন, এবং যখন Microservices নিয়ে কাজ করবেন তখন &lt;strong&gt;gRPC&lt;/strong&gt; শিখুন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Q:3&lt;/em&gt;&lt;/strong&gt; - &lt;strong&gt;Database Systems (SQL, NoSQL)&lt;/strong&gt; ?&lt;br&gt;
&lt;strong&gt;&lt;em&gt;ANSWER&lt;/em&gt;&lt;/strong&gt;: &lt;/p&gt;

&lt;p&gt;🗄️ &lt;strong&gt;Database কী?&lt;/strong&gt;&lt;br&gt;
Database হলো &lt;strong&gt;ডেটা সংরক্ষণের সিস্টেম&lt;/strong&gt;। আপনার অ্যাপের সব ডেটা — User, Product, Order — সব কিছু Database এ থাকে।&lt;br&gt;
দুই ধরনের Database আছে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SQL (Relational)          NoSQL (Non-Relational)
─────────────────         ──────────────────────
MySQL, PostgreSQL    vs   MongoDB, Redis
টেবিল আকারে ডেটা         Document/Key-Value আকারে
Fixed Schema              Flexible Schema
Relations আছে            Relations নেই (বেশিরভাগ)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🔵 &lt;strong&gt;PART 1 — SQL Database&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;SQL কী?&lt;/strong&gt;&lt;br&gt;
SQL Database এ ডেটা &lt;strong&gt;টেবিল&lt;/strong&gt; আকারে থাকে — অনেকটা Excel Spreadsheet এর মতো। প্রতিটা Row হলো একটা Record, প্রতিটা Column হলো একটা Field।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;products টেবিল:
┌────┬─────────────┬────────┬───────┬─────────────┐
│ id │ name        │ price  │ stock │ category_id │
├────┼─────────────┼────────┼───────┼─────────────┤
│  1 │ iPhone 15   │ 1200   │  50   │      1      │
│  2 │ Samsung S24 │  999   │  30   │      1      │
│  3 │ MacBook Pro │ 2500   │  20   │      2      │
└────┴─────────────┴────────┴───────┴─────────────┘

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Laravel-এ Database Migration — Professional ভাবে:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// database/migrations/create_products_table.php&lt;/span&gt;
&lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'products'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Blueprint&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// Primary Key&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Auto increment bigint&lt;/span&gt;

    &lt;span class="c1"&gt;// Basic Fields&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'slug'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// URL friendly name&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'description'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;nullable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'price'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 99999999.99 পর্যন্ত&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'cost_price'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;unsignedInteger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'stock'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;unsignedInteger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'min_stock'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Low stock alert&lt;/span&gt;

    &lt;span class="c1"&gt;// Status&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;enum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'active'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'inactive'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'draft'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'active'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'is_featured'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Foreign Key — Category এর সাথে সম্পর্ক&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;foreignId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'category_id'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;constrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'categories'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;onDelete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'restrict'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Category মুছলে Error দেবে&lt;/span&gt;

    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;foreignId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'brand_id'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;nullable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
          &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;constrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'brands'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;onDelete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'set null'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Brand মুছলে NULL হবে&lt;/span&gt;

    &lt;span class="c1"&gt;// Performance এর জন্য Index&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'category_id'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'price'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// Composite Index&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;fullText&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'description'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// Full-text search&lt;/span&gt;

    &lt;span class="c1"&gt;// Timestamps&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;timestamps&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// created_at, updated_at&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;softDeletes&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// deleted_at — পুরোপুরি মুছবে না&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Eloquent Relationships — টেবিলের মধ্যে সম্পর্ক:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// ১. One to Many — একটা Category তে অনেক Product&lt;/span&gt;
&lt;span class="c1"&gt;// Category Model&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Category&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;HasMany&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;hasMany&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// শুধু Active Product&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;activeProducts&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;HasMany&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;hasMany&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'active'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ২. Many to Many — একটা Product এ অনেক Tag,&lt;/span&gt;
&lt;span class="c1"&gt;//    একটা Tag এ অনেক Product&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;BelongsToMany&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;belongsToMany&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Tag&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'product_tags'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;withPivot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'added_by'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Pivot table এর extra field&lt;/span&gt;
                    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;withTimestamps&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ৩. Has Many Through — User এর Orders এর Products&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;purchasedProducts&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;HasManyThrough&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;hasManyThrough&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'user_id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// orders.user_id&lt;/span&gt;
            &lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         &lt;span class="c1"&gt;// products.id&lt;/span&gt;
            &lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         &lt;span class="c1"&gt;// users.id&lt;/span&gt;
            &lt;span class="s1"&gt;'product_id'&lt;/span&gt;  &lt;span class="c1"&gt;// orders.product_id&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ৪. Polymorphic — Comment একসাথে Product ও Blog এ থাকতে পারে&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Comment&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;commentable&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;MorphTo&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;morphTo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;MorphMany&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;morphMany&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Comment&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'commentable'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Advanced Eloquent Queries:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// ১. Complex Query Builder&lt;/span&gt;
&lt;span class="nv"&gt;$products&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="s1"&gt;'products.*'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'(SELECT AVG(rating) FROM reviews
                  WHERE reviews.product_id = products.id) as avg_rating'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'(SELECT COUNT(*) FROM order_items
                  WHERE order_items.product_id = products.id) as total_sold'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'category:id,name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'brand:id,name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'images'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;withCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'reviews'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'active'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'stock'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;whereBetween&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'price'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;whereHas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'is_active'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;when&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'search'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$search&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$search&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'like'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"%&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$search&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;%"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                  &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;orWhere&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'description'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'like'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"%&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$search&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;%"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;orderByDesc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'total_sold'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;orderByDesc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'avg_rating'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;paginate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ২. Subquery — সবচেয়ে বেশি বিক্রি হওয়া Product&lt;/span&gt;
&lt;span class="nv"&gt;$topProducts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;addSelect&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="s1"&gt;'last_order_date'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'created_at'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;whereColumn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'product_id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'products.id'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;latest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// ৩. Aggregation — Sales Report&lt;/span&gt;
&lt;span class="nv"&gt;$salesReport&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DATE(created_at) as date'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'COUNT(*) as total_orders'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'SUM(total) as revenue'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'AVG(total) as avg_order_value'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'MAX(total) as highest_order'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'completed'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;whereBetween&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'created_at'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;startOfMonth&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;endOfMonth&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;groupBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'date'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'date'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// ৪. Transaction — একসাথে অনেক কাজ, একটা ব্যর্থ হলে সব Rollback&lt;/span&gt;
&lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Order তৈরি করুন&lt;/span&gt;
    &lt;span class="nv"&gt;$order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="s1"&gt;'user_id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="s1"&gt;'total'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'status'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'pending'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;]);&lt;/span&gt;

    &lt;span class="c1"&gt;// প্রতিটা Product এর জন্য OrderItem তৈরি করুন&lt;/span&gt;
    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Stock check with lock — Race condition এড়াতে&lt;/span&gt;
        &lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;lockForUpdate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;findOrFail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'product_id'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nv"&gt;$item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'quantity'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;\Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; এর stock নেই"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nc"&gt;OrderItem&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="s1"&gt;'order_id'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'product_id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'quantity'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'quantity'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="s1"&gt;'price'&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;]);&lt;/span&gt;

        &lt;span class="c1"&gt;// Stock কমিয়ে দিন&lt;/span&gt;
        &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;decrement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'stock'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'quantity'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Payment record তৈরি করুন&lt;/span&gt;
    &lt;span class="nc"&gt;Payment&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="s1"&gt;'order_id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'amount'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'method'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;payment_method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;]);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Database Performance — SQL Optimization:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// ১. N+1 Query সমস্যা — সবচেয়ে Common ভুল&lt;/span&gt;
&lt;span class="c1"&gt;// ❌ ভুল — ১০০ Product এর জন্য ১০১ টা Query!&lt;/span&gt;
&lt;span class="nv"&gt;$products&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$products&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// প্রতিবার DB hit&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;brand&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;// আবার DB hit&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ✅ সঠিক — মাত্র ৩টা Query&lt;/span&gt;
&lt;span class="nv"&gt;$products&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'brand'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// ২. Lazy Loading vs Eager Loading&lt;/span&gt;
&lt;span class="c1"&gt;// Lazy — শুধু দরকার হলে load হবে (সাবধানে ব্যবহার করুন)&lt;/span&gt;
&lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$showCategory&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// এখন load হবে&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ৩. Chunking — লক্ষ লক্ষ Record Process করুন Memory Overflow ছাড়া&lt;/span&gt;
&lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
       &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'active'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
       &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;chunkById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$products&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$products&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
               &lt;span class="c1"&gt;// প্রতি ৫০০টা করে process হবে&lt;/span&gt;
               &lt;span class="nc"&gt;GenerateProductReport&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
           &lt;span class="p"&gt;}&lt;/span&gt;
       &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// ৪. Cursor — আরো কম Memory তে&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// একটা একটা করে process — memory খুব কম লাগে&lt;/span&gt;
    &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'slug'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Str&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)]);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ৫. Index ব্যবহার করুন — Query দ্রুত হবে&lt;/span&gt;
&lt;span class="c1"&gt;// Migration এ:&lt;/span&gt;
&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                    &lt;span class="c1"&gt;// Single index&lt;/span&gt;
&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'category_id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;   &lt;span class="c1"&gt;// Composite index&lt;/span&gt;
&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'created_at'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;               &lt;span class="c1"&gt;// Date filter এর জন্য&lt;/span&gt;

&lt;span class="c1"&gt;// ৬. Query Cache&lt;/span&gt;
&lt;span class="nv"&gt;$popularProducts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'popular_products'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                  &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'is_featured'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                  &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;orderByDesc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'total_sold'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                  &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                  &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Cache clear করুন Product update হলে&lt;/span&gt;
&lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ProductObserver&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductObserver&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;saved&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Product&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;forget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'popular_products'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;forget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"product_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;PostgreSQL — MySQL এর চেয়ে শক্তিশালী কোথায়?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// ১. JSON Column — Flexible Data Store করুন&lt;/span&gt;
&lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'products'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Blueprint&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;jsonb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'attributes'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;nullable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// jsonb — indexed &amp;amp; faster&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;jsonb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'metadata'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;nullable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// JSON এ data store করুন&lt;/span&gt;
&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="s1"&gt;'attributes'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'color'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Space Black'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'storage'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'256GB'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'ram'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'8GB'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="c1"&gt;// JSON field দিয়ে query করুন&lt;/span&gt;
&lt;span class="nv"&gt;$blackPhones&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'attributes-&amp;gt;color'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Space Black'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                       &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'attributes-&amp;gt;storage'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'256GB'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                       &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// ২. Full-Text Search — PostgreSQL অনেক ভালো&lt;/span&gt;
&lt;span class="nv"&gt;$products&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;whereRaw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;"to_tsvector('english', name || ' ' || description)
     @@ plainto_tsquery('english', ?)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// ৩. Window Functions — Advanced Analytics&lt;/span&gt;
&lt;span class="nv"&gt;$rankedProducts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"
    SELECT
        id, name, price, category_id,
        RANK() OVER (
            PARTITION BY category_id
            ORDER BY price DESC
        ) as price_rank,
        SUM(price) OVER (
            PARTITION BY category_id
        ) as category_total
    FROM products
    WHERE status = 'active'
"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🟠 &lt;strong&gt;PART 2 — NoSQL Database&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NoSQL কী এবং কেন দরকার?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;NoSQL এ ডেটা &lt;strong&gt;Document&lt;/strong&gt; আকারে থাকে — অনেকটা JSON এর মতো। Fixed Schema নেই, যেকোনো Structure এ ডেটা রাখা যায়।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SQL (MySQL):                    NoSQL (MongoDB):
──────────────────              ────────────────────────────
টেবিল → Row → Column           Collection → Document → Field

products টেবিল:                products collection:
id | name | price              {
1  | iPhone | 1200               "_id": "abc123",
                                 "name": "iPhone 15",
                                 "price": 1200,
                                 "variants": [        ← Nested!
                                   {"color": "Black", "stock": 20},
                                   {"color": "White", "stock": 15}
                                 ],
                                 "specs": {           ← Flexible!
                                   "ram": "8GB",
                                   "storage": "256GB"
                                 }
                               }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;MongoDB — Laravel Setup:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bashcomposer require mongodb/laravel-mongodb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// config/database.php&lt;/span&gt;
&lt;span class="s1"&gt;'mongodb'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'driver'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'mongodb'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'host'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'MONGODB_HOST'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s1"&gt;'port'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'MONGODB_PORT'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;27017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s1"&gt;'database'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'MONGODB_DATABASE'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'myapp'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s1"&gt;'username'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'MONGODB_USERNAME'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s1"&gt;'password'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'MONGODB_PASSWORD'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;

&lt;span class="c1"&gt;// Model&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'mongodb'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$collection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'products'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$fillable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'price'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'stock'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'attributes'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'variants'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'images'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'category'&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;MongoDB CRUD Operations:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// ১. Create — Flexible Structure&lt;/span&gt;
&lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="s1"&gt;'name'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'iPhone 15 Pro'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'price'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1299&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'stock'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="c1"&gt;// Nested Object — SQL এ আলাদা টেবিল লাগতো&lt;/span&gt;
    &lt;span class="s1"&gt;'category'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'id'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Smartphones'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'slug'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'smartphones'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;

    &lt;span class="c1"&gt;// Array of Objects — SQL এ Junction Table লাগতো&lt;/span&gt;
    &lt;span class="s1"&gt;'variants'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'color'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Natural Titanium'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'storage'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'128GB'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'stock'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'price'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1299&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'color'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Black Titanium'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="s1"&gt;'storage'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'256GB'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'stock'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'price'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1499&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'color'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'White Titanium'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="s1"&gt;'storage'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'512GB'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'stock'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'price'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1699&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;

    &lt;span class="c1"&gt;// Completely Different Attributes per Product&lt;/span&gt;
    &lt;span class="s1"&gt;'specs'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'chip'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'A17 Pro'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'display'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'6.1 inch Super Retina XDR'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'camera'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'48MP Main + 12MP Ultra Wide'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'battery'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'3274 mAh'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;

    &lt;span class="s1"&gt;'tags'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'flagship'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'apple'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'5g'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'pro'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s1"&gt;'images'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'url'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'front.jpg'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'is_primary'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'url'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'back.jpg'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="s1"&gt;'is_primary'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="c1"&gt;// ২. Read — Nested Field Query&lt;/span&gt;
&lt;span class="c1"&gt;// Nested field এ search&lt;/span&gt;
&lt;span class="nv"&gt;$blackPhones&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'variants.color'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Black Titanium'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Array এ value খুঁজুন&lt;/span&gt;
&lt;span class="nv"&gt;$taggedProducts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'tags'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'flagship'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Nested object এ range query&lt;/span&gt;
&lt;span class="nv"&gt;$affordableVariants&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'variants.price'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;='&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// ৩. Update — Nested Array Update&lt;/span&gt;
&lt;span class="c1"&gt;// Array তে নতুন item যোগ করুন&lt;/span&gt;
&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'tags'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'bestseller'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Nested object update করুন&lt;/span&gt;
&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'specs.battery'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'3500 mAh'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="c1"&gt;// Array থেকে item সরান&lt;/span&gt;
&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;pull&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'tags'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'old-tag'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ৪. Aggregation Pipeline — Complex Analytics&lt;/span&gt;
&lt;span class="nv"&gt;$categoryStats&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$collection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$collection&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;aggregate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="c1"&gt;// Stage 1: Filter&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'$match'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'active'&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt;

        &lt;span class="c1"&gt;// Stage 2: Unwind array&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'$unwind'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'$variants'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;

        &lt;span class="c1"&gt;// Stage 3: Group করুন&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'$group'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'_id'&lt;/span&gt;         &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'$category.name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'total_products'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'$sum'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="s1"&gt;'avg_price'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'$avg'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'$variants.price'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="s1"&gt;'total_stock'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'$sum'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'$variants.stock'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="s1"&gt;'min_price'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'$min'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'$variants.price'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="s1"&gt;'max_price'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'$max'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'$variants.price'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;]],&lt;/span&gt;

        &lt;span class="c1"&gt;// Stage 4: Sort&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'$sort'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'total_products'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt;

        &lt;span class="c1"&gt;// Stage 5: Limit&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'$limit'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Redis — সবচেয়ে দ্রুত NoSQL:&lt;/strong&gt;&lt;br&gt;
Redis হলো &lt;strong&gt;In-Memory&lt;/strong&gt; Database — সব ডেটা RAM এ থাকে, তাই অত্যন্ত দ্রুত। এটা মূলত &lt;strong&gt;Cache, Session, Queue, এবং Real-time&lt;/strong&gt; কাজে ব্যবহার হয়।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// ১. Simple Cache&lt;/span&gt;
&lt;span class="c1"&gt;// Set — ১ ঘন্টার জন্য cache করুন&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'product:1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// Get&lt;/span&gt;
&lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;json_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'product:1'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// Delete&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;del&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'product:1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ২. Hash — Object Store করুন&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;hmset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'name'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'রাকিব হাসান'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'email'&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'rakib@example.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'last_login'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;toDateTimeString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="s1"&gt;'total_orders'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="c1"&gt;// একটা field পড়ুন&lt;/span&gt;
&lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;hget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// সব field পড়ুন&lt;/span&gt;
&lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;hgetall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ৩. Counter — View Count, Like Count&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;incr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"product:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:views"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;incrby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"product:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:likes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$views&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"product:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:views"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ৪. Sorted Set — Leaderboard/Ranking&lt;/span&gt;
&lt;span class="c1"&gt;// Score যোগ করুন&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;zadd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'product:sales'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'iPhone 15'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Samsung S24'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="c1"&gt;// Top 10 দেখুন (সবচেয়ে বেশি বিক্রি)&lt;/span&gt;
&lt;span class="nv"&gt;$topSellers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;zrevrange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'product:sales'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'WITHSCORES'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ৫. Pub/Sub — Real-time Notification&lt;/span&gt;
&lt;span class="c1"&gt;// Publisher (Event হলে publish করুন)&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'order.created'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="s1"&gt;'order_id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'user_id'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'total'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]));&lt;/span&gt;

&lt;span class="c1"&gt;// Subscriber (Background এ চালু থাকবে)&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'order.created'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;json_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// WebSocket দিয়ে User কে notify করুন&lt;/span&gt;
    &lt;span class="nf"&gt;broadcast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OrderCreatedEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// ৬. Rate Limiter — Redis দিয়ে&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ApiRateLimiter&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$maxAttempts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$decaySeconds&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;incr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$current&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;expire&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$decaySeconds&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$current&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nv"&gt;$maxAttempts&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Middleware এ ব্যবহার করুন&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$rateLimiter&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"api:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'message'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Too many requests'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🔄 &lt;strong&gt;PART 3 — SQL vs NoSQL কোনটা কখন?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php
// ✅ SQL ব্যবহার করুন যখন:
// - Data structure fixed এবং সম্পর্ক আছে
// - Financial data (Bank, Payment) — ACID দরকার
// - Complex Joins এবং Transactions দরকার
// - Data Integrity সবচেয়ে গুরুত্বপূর্ণ

// ✅ NoSQL ব্যবহার করুন যখন:
// - Data structure flexible বা unknown
// - Huge scale (লক্ষ লক্ষ record দ্রুত read/write)
// - JSON/Document store করতে হবে
// - Real-time বা Cache দরকার
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Real Project এ দুটো একসাথে ব্যবহার:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ১. প্রথমে Redis Cache চেক করুন&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$cacheKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"product:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// Cache এ আছে? → সরাসরি দিন (সবচেয়ে দ্রুত)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$cached&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$cacheKey&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;json_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$cached&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// MySQL থেকে নিন → Cache এ রাখুন&lt;/span&gt;
        &lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'brand'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;findOrFail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$productArray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;toArray&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$cacheKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$productArray&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$productArray&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// ২. Product View Track করুন MongoDB তে&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;trackView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// MongoDB তে analytics store করুন&lt;/span&gt;
        &lt;span class="nc"&gt;ProductView&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="s1"&gt;'product_id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'user_id'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'ip'&lt;/span&gt;         &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="s1"&gt;'user_agent'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;userAgent&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="s1"&gt;'viewed_at'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="s1"&gt;'session'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="s1"&gt;'source'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'referer'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="s1"&gt;'platform'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;detectPlatform&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;]);&lt;/span&gt;

        &lt;span class="c1"&gt;// Redis এ view count বাড়ান&lt;/span&gt;
        &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;incr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"product:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:views"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// ৩. Search এর জন্য Elasticsearch&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;Collection&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Elasticsearch এ full-text search&lt;/span&gt;
        &lt;span class="nv"&gt;$results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Elasticsearch&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="s1"&gt;'index'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'products'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'body'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="s1"&gt;'query'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                    &lt;span class="s1"&gt;'multi_match'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                        &lt;span class="s1"&gt;'query'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s1"&gt;'fields'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'name^3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'description'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'tags^2'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                        &lt;span class="s1"&gt;'fuzziness'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'AUTO'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;]);&lt;/span&gt;

        &lt;span class="c1"&gt;// ID গুলো নিয়ে MySQL থেকে full data আনুন&lt;/span&gt;
        &lt;span class="nv"&gt;$ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'hits'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'hits'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;pluck&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'_id'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;whereIn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🏗️ &lt;strong&gt;Database Design Best Practices&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// ১. Naming Convention — সবসময় consistent রাখুন&lt;/span&gt;
&lt;span class="c1"&gt;// টেবিল: plural, snake_case&lt;/span&gt;
&lt;span class="c1"&gt;// products, order_items, product_categories&lt;/span&gt;

&lt;span class="c1"&gt;// Column: singular, snake_case&lt;/span&gt;
&lt;span class="c1"&gt;// user_id, created_at, is_active&lt;/span&gt;

&lt;span class="c1"&gt;// Foreign Key: table_name + _id&lt;/span&gt;
&lt;span class="c1"&gt;// category_id, brand_id, user_id&lt;/span&gt;

&lt;span class="c1"&gt;// ২. Soft Delete — পুরোপুরি মুছবেন না&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;SoftDeletes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// deleted_at column এ date রাখে&lt;/span&gt;

    &lt;span class="c1"&gt;// Trashed সহ query&lt;/span&gt;
    &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;withTrashed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// শুধু Trashed&lt;/span&gt;
    &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;onlyTrashed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Restore করুন&lt;/span&gt;
    &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;withTrashed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;restore&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// সত্যিকার Delete&lt;/span&gt;
    &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;withTrashed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;forceDelete&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ৩. Observer — Model Events Handle করুন&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductObserver&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;creating&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Product&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Auto slug generate করুন&lt;/span&gt;
        &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;slug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Str&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;updating&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Product&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Stock কমলে Alert দিন&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;isDirty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'stock'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;min_stock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;LowStockAlert&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;deleted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Product&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Cache clear করুন&lt;/span&gt;
        &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;forget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"product:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;forget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'popular_products'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ৪. Scope — বারবার একই Query না লিখতে&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Global Scope — সবসময় apply হবে&lt;/span&gt;
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;booted&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;static&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;addGlobalScope&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'active'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'active'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Local Scope — দরকার মতো ব্যবহার করুন&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;scopeInStock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'stock'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;scopeFeatured&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'is_featured'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;scopePriceRange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$min&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;whereBetween&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'price'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$min&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$max&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ব্যবহার:&lt;/span&gt;
&lt;span class="nv"&gt;$products&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;inStock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                   &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;featured&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                   &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;priceRange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                   &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;📝 &lt;strong&gt;সংক্ষেপে মনে রাখুন&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;SQL&lt;/strong&gt; (MySQL/PostgreSQL) ব্যবহার করুন যখন ডেটার মধ্যে সম্পর্ক আছে এবং Transactions দরকার — যেমন Orders, Payments, Users। &lt;strong&gt;MongoDB&lt;/strong&gt; ব্যবহার করুন যখন ডেটার Structure flexible — যেমন Products এর Variants, Analytics। &lt;strong&gt;Redis&lt;/strong&gt; ব্যবহার করুন Cache, Session, Queue এবং Real-time এর জন্য — এটা সবচেয়ে দ্রুত।&lt;br&gt;
Real Project এ তিনটাই একসাথে ব্যবহার করা হয় — &lt;strong&gt;MySQL&lt;/strong&gt; মূল ডেটার জন্য, &lt;strong&gt;Redis&lt;/strong&gt; speed এর জন্য, &lt;strong&gt;MongoDB&lt;/strong&gt; flexible data এর জন্য।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Q:4&lt;/em&gt;&lt;/strong&gt; - &lt;strong&gt;Distributed Systems (consistency, replication)&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Answer&lt;/em&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;Distributed System কী?&lt;/strong&gt;&lt;br&gt;
Distributed System হলো এমন একটি সিস্টেম যেখানে &lt;strong&gt;একাধিক কম্পিউটার/সার্ভার&lt;/strong&gt; একসাথে কাজ করে — কিন্তু বাইরে থেকে দেখলে মনে হয় &lt;strong&gt;একটাই সিস্টেম&lt;/strong&gt;।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ Single Server (সমস্যা):
[সব User] → [একটা Server] → [একটা Database]
             ↑ এটা crash করলে সব শেষ!

✅ Distributed System (সমাধান):
[User] → [Load Balancer]
              ↓
    ┌─────────┬─────────┐
[Server 1] [Server 2] [Server 3]
    ↓           ↓          ↓
[DB Master] ←──────────────┘
    ↓
[DB Replica 1] [DB Replica 2]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🧩 &lt;strong&gt;PART 1 — CAP Theorem&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Distributed System এর সবচেয়ে গুরুত্বপূর্ণ Theory&lt;/strong&gt;&lt;br&gt;
CAP Theorem বলে — একটা Distributed System একসাথে তিনটার মধ্যে &lt;strong&gt;মাত্র দুটো&lt;/strong&gt; গ্যারান্টি দিতে পারে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C = Consistency    → সব Node এ একই Data দেখাবে
A = Availability   → সবসময় Response পাবেন
P = Partition      → Network ভাগ হলেও সিস্টেম চলবে
  Tolerance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        Consistency (C)
              △
              │
              │
    CA ───────┼──────── CP
              │
              │
              │
    ──────────┼──────────
              │
    AP        │
              │
        Partition (P) ──── Availability (A)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CA — MySQL, PostgreSQL
     (Network Partition হলে বন্ধ হয়ে যায়)

CP — MongoDB, Redis, HBase
     (Partition হলে Availability sacrifice করে)

AP — Cassandra, CouchDB
     (Partition হলে Consistency sacrifice করে)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Real-world উদাহরণ:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// ধরুন আপনার E-commerce এ Payment হচ্ছে&lt;/span&gt;

&lt;span class="c1"&gt;// CP System (Bank/Payment) — Consistency বেশি জরুরি&lt;/span&gt;
&lt;span class="c1"&gt;// Network issue হলে → Transaction বন্ধ রাখো&lt;/span&gt;
&lt;span class="c1"&gt;// কারণ: ভুল balance দেখানো মানে বড় সমস্যা&lt;/span&gt;

&lt;span class="c1"&gt;// AP System (Product View Count) — Availability বেশি জরুরি&lt;/span&gt;
&lt;span class="c1"&gt;// Network issue হলে → পুরনো count দেখাও, পরে ঠিক করো&lt;/span&gt;
&lt;span class="c1"&gt;// কারণ: ১০০ এর জায়গায় ৯৮ দেখালে বড় ক্ষতি নেই&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🔄 &lt;strong&gt;PART 2 — Consistency (সামঞ্জস্যতা)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consistency Levels — কতটা সঠিক ডেটা দরকার?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Strong&lt;/span&gt; &lt;span class="nc"&gt;Consistency&lt;/span&gt;    &lt;span class="err"&gt;→&lt;/span&gt;  &lt;span class="n"&gt;সবচ&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;&lt;span class="n"&gt;য&lt;/span&gt;&lt;span class="err"&gt;়ে&lt;/span&gt; &lt;span class="n"&gt;নত&lt;/span&gt;&lt;span class="err"&gt;ু&lt;/span&gt;&lt;span class="n"&gt;ন&lt;/span&gt; &lt;span class="nc"&gt;Data&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="n"&gt;ধ&lt;/span&gt;&lt;span class="err"&gt;ী&lt;/span&gt;&lt;span class="n"&gt;র&lt;/span&gt;
&lt;span class="nc"&gt;Eventual&lt;/span&gt; &lt;span class="nc"&gt;Consistency&lt;/span&gt;  &lt;span class="err"&gt;→&lt;/span&gt;  &lt;span class="n"&gt;একট&lt;/span&gt;&lt;span class="err"&gt;ু&lt;/span&gt; &lt;span class="n"&gt;প&lt;/span&gt;&lt;span class="err"&gt;ু&lt;/span&gt;&lt;span class="n"&gt;রন&lt;/span&gt;&lt;span class="err"&gt;ো&lt;/span&gt; &lt;span class="n"&gt;হত&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt; &lt;span class="n"&gt;প&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;র&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="n"&gt;দ&lt;/span&gt;&lt;span class="err"&gt;্&lt;/span&gt;&lt;span class="n"&gt;র&lt;/span&gt;&lt;span class="err"&gt;ু&lt;/span&gt;&lt;span class="n"&gt;ত&lt;/span&gt;
&lt;span class="nc"&gt;Weak&lt;/span&gt; &lt;span class="nc"&gt;Consistency&lt;/span&gt;      &lt;span class="err"&gt;→&lt;/span&gt;  &lt;span class="n"&gt;প&lt;/span&gt;&lt;span class="err"&gt;ু&lt;/span&gt;&lt;span class="n"&gt;রন&lt;/span&gt;&lt;span class="err"&gt;ো&lt;/span&gt; &lt;span class="nc"&gt;Data&lt;/span&gt; &lt;span class="n"&gt;দ&lt;/span&gt;&lt;span class="err"&gt;ি&lt;/span&gt;&lt;span class="n"&gt;ত&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt; &lt;span class="n"&gt;প&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;র&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="n"&gt;সবচ&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;&lt;span class="n"&gt;য&lt;/span&gt;&lt;span class="err"&gt;়ে&lt;/span&gt; &lt;span class="n"&gt;দ&lt;/span&gt;&lt;span class="err"&gt;্&lt;/span&gt;&lt;span class="n"&gt;র&lt;/span&gt;&lt;span class="err"&gt;ু&lt;/span&gt;&lt;span class="n"&gt;ত&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Laravel-এ Consistency Implement করা:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;১. Strong Consistency — Critical Data এর জন্য:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// Payment বা Financial Transaction — সবসময় Master DB পড়ুন&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PaymentService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;processPayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Order&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$paymentData&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;Payment&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$paymentData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

            &lt;span class="c1"&gt;// Master DB থেকে পড়ুন — সবচেয়ে নতুন data&lt;/span&gt;
            &lt;span class="c1"&gt;// Replica থেকে নয়! Stale data বিপজ্জনক&lt;/span&gt;
            &lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;lockForUpdate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;findOrFail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nv"&gt;$wallet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Wallet&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;lockForUpdate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'user_id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;firstOrFail&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

            &lt;span class="c1"&gt;// Balance চেক করুন&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$wallet&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InsufficientBalanceException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="s2"&gt;"Balance কম। প্রয়োজন: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, আছে: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$wallet&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
                &lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="c1"&gt;// Balance কাটুন&lt;/span&gt;
            &lt;span class="nv"&gt;$wallet&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;decrement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'balance'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="c1"&gt;// Payment Record তৈরি করুন&lt;/span&gt;
            &lt;span class="nv"&gt;$payment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Payment&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                &lt;span class="s1"&gt;'order_id'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s1"&gt;'user_id'&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s1"&gt;'amount'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s1"&gt;'status'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'completed'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s1"&gt;'reference_no'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;generateReference&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="p"&gt;]);&lt;/span&gt;

            &lt;span class="c1"&gt;// Order Status Update করুন&lt;/span&gt;
            &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'paid'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'payment_id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$payment&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$payment&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Config — Critical Query সবসময় Master এ&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CriticalController&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Controller&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;sensitiveAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Sticky Session — এই request এর সব query Master এ যাবে&lt;/span&gt;
        &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;statement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nv"&gt;$result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;২. Eventual Consistency — Non-critical Data এর জন্য:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// Product View Count — একটু পুরনো হলেও সমস্যা নেই&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductViewController&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;track&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Redis এ দ্রুত increment করুন (Eventual)&lt;/span&gt;
        &lt;span class="c1"&gt;// Database এ সাথে সাথে না গিয়ে পরে Sync হবে&lt;/span&gt;
        &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;incr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"product:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:views"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;expire&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"product:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:views"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;86400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Queue এ Job দিন — পরে DB Sync হবে&lt;/span&gt;
        &lt;span class="nc"&gt;SyncProductViews&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addMinutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Background Job — Redis থেকে DB তে Sync&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SyncProductViews&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;ShouldQueue&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$views&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"product:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;productId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:views"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
               &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'view_count'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"view_count + &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$views&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)]);&lt;/span&gt;

        &lt;span class="c1"&gt;// Redis reset করুন&lt;/span&gt;
        &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;del&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"product:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;productId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:views"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;৩. Read-Your-Writes Consistency:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// Problem: User profile update করলো,&lt;/span&gt;
&lt;span class="c1"&gt;// কিন্তু Replica থেকে পুরনো data দেখাচ্ছে!&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserProfileService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;updateProfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;User&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;User&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Master এ update করুন&lt;/span&gt;
        &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Session এ flag রাখুন — এই user সবে update করেছে&lt;/span&gt;
        &lt;span class="nf"&gt;session&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'read_from_master_until'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addSeconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)]);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getProfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;User&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Update করার পর ৫ সেকেন্ড Master থেকে পড়ুন&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;session&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'read_from_master_until'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'mysql_master'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                     &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'users'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                     &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                     &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// তারপর Replica থেকে পড়ুন (দ্রুত)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;📋 &lt;strong&gt;PART 3 — Replication (প্রতিলিপি)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Replication কী?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;একই ডেটা &lt;strong&gt;একাধিক সার্ভারে&lt;/strong&gt; রাখা — যাতে একটা বন্ধ হলেও বাকিগুলো চলে।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Master-Slave Replication:

[Write] → [Master DB] ──→ [Slave/Replica 1] ← [Read]
                      └──→ [Slave/Replica 2] ← [Read]
                      └──→ [Slave/Replica 3] ← [Read]

Master: শুধু Write
Slave:  শুধু Read (অনেক বেশি Read Traffic সামলাতে পারে)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Laravel-এ Master-Slave Replication:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// config/database.php&lt;/span&gt;
&lt;span class="s1"&gt;'mysql'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'driver'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'mysql'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="c1"&gt;// Write — সব INSERT, UPDATE, DELETE এখানে যাবে&lt;/span&gt;
    &lt;span class="s1"&gt;'write'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'host'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DB_MASTER_HOST'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'10.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s1"&gt;'port'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DB_MASTER_PORT'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3306&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;

    &lt;span class="c1"&gt;// Read — সব SELECT এখানে যাবে (Load Balance হবে)&lt;/span&gt;
    &lt;span class="s1"&gt;'read'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'host'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DB_REPLICA_1_HOST'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'10.0.0.2'&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'host'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DB_REPLICA_2_HOST'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'10.0.0.3'&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'host'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DB_REPLICA_3_HOST'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'10.0.0.4'&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;

    &lt;span class="s1"&gt;'sticky'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Write এর পর সাথে সাথে Read করলে Master থেকে পড়বে&lt;/span&gt;
    &lt;span class="s1"&gt;'database'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DB_DATABASE'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s1"&gt;'username'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DB_USERNAME'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s1"&gt;'password'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DB_PASSWORD'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;

&lt;span class="c1"&gt;// আলাদা Connection — Critical Read এর জন্য&lt;/span&gt;
&lt;span class="s1"&gt;'mysql_master'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'driver'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'mysql'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'host'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DB_MASTER_HOST'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s1"&gt;'database'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DB_DATABASE'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s1"&gt;'username'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DB_USERNAME'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s1"&gt;'password'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DB_PASSWORD'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Replication Lag Handle করা:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// Problem: Master এ write করলাম,&lt;/span&gt;
&lt;span class="c1"&gt;// কিন্তু Replica তে এখনো পৌঁছায়নি!&lt;/span&gt;
&lt;span class="c1"&gt;// এই সময়কে বলে Replication Lag&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;createOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;Order&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Master এ Order তৈরি করুন&lt;/span&gt;
        &lt;span class="nv"&gt;$order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Replication Lag এড়াতে — ID Cache এ রাখুন&lt;/span&gt;
        &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s2"&gt;"order_exists:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addSeconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// ১০ সেকেন্ড — Lag এর চেয়ে বেশি&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$orderId&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;Order&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// সবে তৈরি হয়েছে? Master থেকে পড়ুন&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"order_exists:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$orderId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'mysql_master'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                     &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'orders'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                     &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$orderId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                     &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// পুরনো Order — Replica থেকে পড়ুন&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$orderId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🔀 &lt;strong&gt;PART 4 — Sharding (ডেটা ভাগ করা)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sharding কী?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;যখন একটা DB Server এ ডেটা অনেক বেশি হয়ে যায়, তখন &lt;strong&gt;ডেটাকে ভাগ করে&lt;/strong&gt; একাধিক সার্ভারে রাখা হয়।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Without Sharding:
[১ কোটি User] → [একটা DB] ← অনেক Slow!

With Sharding:
User ID 1-25 লক্ষ    → [DB Shard 1]
User ID 25-50 লক্ষ   → [DB Shard 2]
User ID 50-75 লক্ষ   → [DB Shard 3]
User ID 75-100 লক্ষ  → [DB Shard 4]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Laravel-এ Sharding Implement করা:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// app/Services/ShardingService.php&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ShardingService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Shard গুলোর Connection name&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$shards&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'db_shard_1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'db_shard_2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'db_shard_3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'db_shard_4'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="c1"&gt;// User ID দিয়ে কোন Shard এ যাবে নির্ধারণ করুন&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getShardForUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$shardIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$userId&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nb"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;shards&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;shards&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$shardIndex&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Geographic Sharding — দেশ অনুযায়ী&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getShardForCountry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$countryCode&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nb"&gt;in_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$countryCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'BD'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'IN'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'PK'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'db_shard_asia'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nb"&gt;in_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$countryCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'US'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'CA'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'db_shard_na'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nb"&gt;in_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$countryCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'GB'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'DE'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'FR'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'db_shard_eu'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="k"&gt;default&lt;/span&gt;                                    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'db_shard_global'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Sharded User Repository&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ShardedUserRepository&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;ShardingService&lt;/span&gt; &lt;span class="nv"&gt;$sharding&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;?object&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$shard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;sharding&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getShardForUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$shard&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                 &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'users'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                 &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                 &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// User তৈরি করুন — ID আগে জানি না&lt;/span&gt;
        &lt;span class="c1"&gt;// তাই সব Shard এ sequentially try করুন&lt;/span&gt;
        &lt;span class="nv"&gt;$userId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;generateUserId&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nv"&gt;$shard&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;sharding&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getShardForUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$shard&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'users'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="s1"&gt;'id'&lt;/span&gt;         &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'name'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="s1"&gt;'email'&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'email'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="s1"&gt;'created_at'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="p"&gt;]);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Cross-Shard Query — সব Shard এ Search করুন&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;searchByEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;?object&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;sharding&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getAllShards&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$shard&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$shard&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                      &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'users'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                      &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'email'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                      &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Parallel Cross-Shard Query — দ্রুত Version&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;searchAllShards&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;Collection&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nv"&gt;$jobs&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

        &lt;span class="c1"&gt;// সব Shard এ একসাথে Query পাঠান&lt;/span&gt;
        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;sharding&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getAllShards&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$shard&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$jobs&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SearchShard&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$shard&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Result collect করুন&lt;/span&gt;
        &lt;span class="c1"&gt;// (Real implementation এ Promise/Async ব্যবহার করুন)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$results&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🔒 &lt;strong&gt;PART 5 — Distributed Locking&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;সমস্যা — Race Condition:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;দ&lt;/span&gt;&lt;span class="err"&gt;ু&lt;/span&gt;&lt;span class="n"&gt;জন&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="n"&gt;একস&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;থ&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt; &lt;span class="n"&gt;শ&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;&lt;span class="n"&gt;ষ&lt;/span&gt; &lt;span class="err"&gt;১&lt;/span&gt;&lt;span class="n"&gt;ট&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt; &lt;span class="n"&gt;ক&lt;/span&gt;&lt;span class="err"&gt;ি&lt;/span&gt;&lt;span class="n"&gt;নত&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt; &lt;span class="n"&gt;চ&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;ইছ&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;

&lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Stock&lt;/span&gt; &lt;span class="nc"&gt;Check&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="err"&gt;১&lt;/span&gt; &lt;span class="n"&gt;আছ&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt; &lt;span class="err"&gt;✓&lt;/span&gt;
&lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Stock&lt;/span&gt; &lt;span class="nc"&gt;Check&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="err"&gt;১&lt;/span&gt; &lt;span class="n"&gt;আছ&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt; &lt;span class="err"&gt;✓&lt;/span&gt;  &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="n"&gt;একই&lt;/span&gt; &lt;span class="n"&gt;সময&lt;/span&gt;&lt;span class="err"&gt;়ে&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt; &lt;span class="nc"&gt;Create&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nc"&gt;Stock&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt; &lt;span class="nc"&gt;Create&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nc"&gt;Stock&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="n"&gt;ব&lt;/span&gt;&lt;span class="err"&gt;ি&lt;/span&gt;&lt;span class="n"&gt;পদ&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution — Distributed Lock দিয়ে:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// app/Services/DistributedLockService.php&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DistributedLockService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;Redis&lt;/span&gt; &lt;span class="nv"&gt;$redis&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$lockPrefix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'lock:'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Lock নিন&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;acquire&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$resource&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$ttlSeconds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
    &lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;?string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$lockKey&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;lockPrefix&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$resource&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;$lockToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Str&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Unique token&lt;/span&gt;

        &lt;span class="c1"&gt;// SET NX — শুধু তখনই set হবে যদি না থাকে&lt;/span&gt;
        &lt;span class="nv"&gt;$acquired&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nv"&gt;$lockKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nv"&gt;$lockToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'EX'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$ttlSeconds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// TTL&lt;/span&gt;
            &lt;span class="s1"&gt;'NX'&lt;/span&gt;                &lt;span class="c1"&gt;// Only if Not Exists&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$acquired&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nv"&gt;$lockToken&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Lock ছাড়ুন — শুধু যে নিয়েছে সেই ছাড়তে পারবে&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$resource&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$token&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$lockKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;lockPrefix&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$resource&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// Lua Script — Atomic operation&lt;/span&gt;
        &lt;span class="nv"&gt;$script&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"
            if redis.call('get', KEYS[1]) == ARGV[1] then
                return redis.call('del', KEYS[1])
            else
                return 0
            end
        "&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="k"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$script&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$lockKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Lock সহ কাজ করুন — Automatic release&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;withLock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$resource&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="kt"&gt;callable&lt;/span&gt; &lt;span class="nv"&gt;$callback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$ttl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
    &lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;mixed&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;acquire&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$resource&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$ttl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;LockNotAcquiredException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="s2"&gt;"Resource '&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$resource&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;' is currently locked. Please try again."&lt;/span&gt;
            &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$callback&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$resource&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ব্যবহার — Product Purchase এ&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PurchaseController&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Controller&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;DistributedLockService&lt;/span&gt; &lt;span class="nv"&gt;$lockService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;OrderService&lt;/span&gt; &lt;span class="nv"&gt;$orderService&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;purchase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$productId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Product এর জন্য Lock নিন&lt;/span&gt;
            &lt;span class="nv"&gt;$result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;lockService&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;withLock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="s2"&gt;"product:purchase:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

                    &lt;span class="c1"&gt;// Lock এর ভেতরে — এখন একজনই আছে&lt;/span&gt;
                    &lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;lockForUpdate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                                      &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;findOrFail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InsufficientStockException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                            &lt;span class="s2"&gt;"মাত্র &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;টা বাকি আছে"&lt;/span&gt;
                        &lt;span class="p"&gt;);&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;

                    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;orderService&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                        &lt;span class="s1"&gt;'product_id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s1"&gt;'quantity'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s1"&gt;'user_id'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                    &lt;span class="p"&gt;]);&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="n"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="c1"&gt;// ১০ সেকেন্ডের মধ্যে শেষ করতে হবে&lt;/span&gt;
            &lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                &lt;span class="s1"&gt;'success'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s1"&gt;'order'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;]);&lt;/span&gt;

        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;LockNotAcquiredException&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                &lt;span class="s1"&gt;'success'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s1"&gt;'message'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'এই মুহূর্তে অনেক চাপ। একটু পরে try করুন।'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;InsufficientStockException&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                &lt;span class="s1"&gt;'success'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s1"&gt;'message'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;422&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;📨 &lt;strong&gt;PART 6 — Distributed Message Queue&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Queue কেন দরকার Distributed System এ?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;সমস&lt;/span&gt;&lt;span class="err"&gt;্&lt;/span&gt;&lt;span class="n"&gt;য&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="nc"&gt;Services&lt;/span&gt; &lt;span class="n"&gt;সর&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;সর&lt;/span&gt;&lt;span class="err"&gt;ি&lt;/span&gt; &lt;span class="n"&gt;কথ&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt; &lt;span class="n"&gt;বলল&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;Order&lt;/span&gt; &lt;span class="nc"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="no"&gt;HTTP&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;Email&lt;/span&gt; &lt;span class="nc"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                          &lt;span class="err"&gt;↑&lt;/span&gt; &lt;span class="n"&gt;যদ&lt;/span&gt;&lt;span class="err"&gt;ি&lt;/span&gt; &lt;span class="n"&gt;down&lt;/span&gt; &lt;span class="n"&gt;থ&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;ক&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;
                          &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt; &lt;span class="n"&gt;fail&lt;/span&gt; &lt;span class="n"&gt;হয&lt;/span&gt;&lt;span class="err"&gt;়ে&lt;/span&gt; &lt;span class="n"&gt;য&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;ব&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;

&lt;span class="n"&gt;সম&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;ধ&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;ন&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="nc"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;দ&lt;/span&gt;&lt;span class="err"&gt;ি&lt;/span&gt;&lt;span class="n"&gt;য&lt;/span&gt;&lt;span class="err"&gt;়ে&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;Order&lt;/span&gt; &lt;span class="nc"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;Queue&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;Email&lt;/span&gt; &lt;span class="nc"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                   &lt;span class="err"&gt;↑&lt;/span&gt; &lt;span class="nc"&gt;Email&lt;/span&gt; &lt;span class="nc"&gt;Service&lt;/span&gt; &lt;span class="n"&gt;down&lt;/span&gt; &lt;span class="n"&gt;হল&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;&lt;span class="n"&gt;ও&lt;/span&gt;
                   &lt;span class="nc"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;এ&lt;/span&gt; &lt;span class="n"&gt;থ&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;কব&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;পর&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt; &lt;span class="n"&gt;প&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;ঠ&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;ব&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// app/Jobs/ProcessOrderJob.php&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProcessOrderJob&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;ShouldQueue&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Dispatchable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;InteractsWithQueue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Queueable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;SerializesModels&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Retry Configuration&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$tries&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;     &lt;span class="c1"&gt;// ৩ বার try করবে&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;// ৬০ সেকেন্ডের বেশি না&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$backoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;     &lt;span class="c1"&gt;// Retry এর আগে ৫ সেকেন্ড অপেক্ষা&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;Order&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="kt"&gt;EmailService&lt;/span&gt; &lt;span class="nv"&gt;$emailService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="kt"&gt;InventoryService&lt;/span&gt; &lt;span class="nv"&gt;$inventoryService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="kt"&gt;NotificationService&lt;/span&gt; &lt;span class="nv"&gt;$notificationService&lt;/span&gt;
    &lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// ১. Inventory Update করুন&lt;/span&gt;
        &lt;span class="nv"&gt;$inventoryService&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;reduceStock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// ২. Email পাঠান&lt;/span&gt;
        &lt;span class="nv"&gt;$emailService&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;sendOrderConfirmation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// ৩. Push Notification পাঠান&lt;/span&gt;
        &lt;span class="nv"&gt;$notificationService&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"আপনার Order #&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; confirmed!"&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// ৪. Analytics Update করুন&lt;/span&gt;
        &lt;span class="nc"&gt;SyncOrderAnalytics&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                          &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;onQueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'analytics'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// আলাদা Queue&lt;/span&gt;
                          &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addMinutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// সব Retry ব্যর্থ হলে&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;\Throwable&lt;/span&gt; &lt;span class="nv"&gt;$exception&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Log&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Order processing failed'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'order_id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'error'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$exception&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="p"&gt;]);&lt;/span&gt;

        &lt;span class="c1"&gt;// Admin কে Alert করুন&lt;/span&gt;
        &lt;span class="nc"&gt;AdminAlert&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s2"&gt;"Order #&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; processing failed!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nv"&gt;$exception&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Order Status Update করুন&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'processing_failed'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Priority Queue — জরুরি কাজ আগে&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderController&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Controller&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;validated&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

        &lt;span class="c1"&gt;// High Priority — দ্রুত process হবে&lt;/span&gt;
        &lt;span class="nc"&gt;ProcessOrderJob&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                       &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;onQueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'high-priority'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Normal Priority&lt;/span&gt;
        &lt;span class="nc"&gt;GenerateInvoice&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                       &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;onQueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'default'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Low Priority — পরে হলেও চলবে&lt;/span&gt;
        &lt;span class="nc"&gt;UpdateRecommendations&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                              &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;onQueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'low-priority'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Queue Worker চালান — আলাদা আলাদা Priority&lt;/span&gt;
&lt;span class="c1"&gt;// php artisan queue:work --queue=high-priority,default,low-priority&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🏥 &lt;strong&gt;PART 7 — Health Check &amp;amp; Fault Tolerance&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// app/Http/Controllers/HealthController.php&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HealthController&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Controller&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;JsonResponse&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$checks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'database'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;checkDatabase&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="s1"&gt;'redis'&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;checkRedis&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="s1"&gt;'queue'&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;checkQueue&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="s1"&gt;'disk'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;checkDisk&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;

        &lt;span class="nv"&gt;$allHealthy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$checks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;every&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$check&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$check&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;'healthy'&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="s1"&gt;'status'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$allHealthy&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s1"&gt;'healthy'&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'degraded'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'timestamp'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;toIso8601String&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="s1"&gt;'services'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$checks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nv"&gt;$allHealthy&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;503&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;checkDatabase&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;microtime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'SELECT 1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nv"&gt;$responseTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nb"&gt;microtime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;$start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="s1"&gt;'status'&lt;/span&gt;        &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'healthy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s1"&gt;'response_time'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$responseTime&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;ms"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;\Exception&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'unhealthy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'error'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;()];&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;checkRedis&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;microtime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;ping&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="nv"&gt;$responseTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nb"&gt;microtime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;$start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="s1"&gt;'status'&lt;/span&gt;        &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'healthy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s1"&gt;'response_time'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$responseTime&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;ms"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;\Exception&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'unhealthy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'error'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;()];&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;checkQueue&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$failedJobs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'failed_jobs'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;count&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'status'&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$failedJobs&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s1"&gt;'healthy'&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'degraded'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'failed_jobs'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$failedJobs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;checkDisk&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$freeSpace&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;disk_free_space&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$totalSpace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;disk_total_space&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$usedPercent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;$freeSpace&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nv"&gt;$totalSpace&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'status'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$usedPercent&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;85&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s1"&gt;'healthy'&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'critical'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'used_percent'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$usedPercent&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;%"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'free_space'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;formatBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$freeSpace&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Circuit Breaker — Service বার বার fail করলে বন্ধ করুন&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CircuitBreaker&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$service&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;    &lt;span class="nv"&gt;$threshold&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// কতবার fail হলে open হবে&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;    &lt;span class="nv"&gt;$timeout&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;// কতক্ষণ open থাকবে&lt;/span&gt;

    &lt;span class="c1"&gt;// States: closed (normal), open (blocked), half-open (testing)&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;callable&lt;/span&gt; &lt;span class="nv"&gt;$action&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;mixed&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="c1"&gt;// Open — Service বন্ধ, সরাসরি Error দিন&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$state&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;'open'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;shouldAttemptReset&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'half-open'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ServiceUnavailableException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; is currently unavailable"&lt;/span&gt;
                &lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$action&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;onSuccess&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Closed State এ ফিরুন&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;\Exception&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;onFailure&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Failure Count বাড়ান&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;onSuccess&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;del&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"circuit:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:failures"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'closed'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;onFailure&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$failures&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;incr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"circuit:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:failures"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;expire&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"circuit:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:failures"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$failures&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'open'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;Log&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Circuit Breaker opened for &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getState&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"circuit:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:state"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s1"&gt;'closed'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$state&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s2"&gt;"circuit:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:state"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nv"&gt;$state&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ব্যবহার&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExternalApiService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;CircuitBreaker&lt;/span&gt; &lt;span class="nv"&gt;$breaker&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;breaker&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Http&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'https://external-api.com/data'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;\Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'API call failed'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;📝 &lt;strong&gt;সংক্ষেপে মনে রাখুন&lt;/strong&gt;&lt;br&gt;
Distributed Systems এর মূল বিষয়গুলো হলো —&lt;br&gt;
&lt;strong&gt;CAP Theorem&lt;/strong&gt; — Consistency, Availability, Partition Tolerance — যেকোনো দুটো বেছে নিতে হবে। &lt;br&gt;
&lt;strong&gt;Consistency&lt;/strong&gt; — Critical data (Payment) তে Strong, Non-critical (View Count) তে Eventual। &lt;br&gt;
&lt;strong&gt;Replication&lt;/strong&gt; — Master Write করে, Replica Read করে — Performance ও Availability দুটোই বাড়ে। &lt;br&gt;
&lt;strong&gt;Sharding&lt;/strong&gt; — ডেটা অনেক বেশি হলে ভাগ করে রাখুন। &lt;br&gt;
&lt;strong&gt;Distributed Lock&lt;/strong&gt; — Race Condition এড়াতে Redis Lock ব্যবহার করুন। &lt;br&gt;
&lt;strong&gt;Circuit Breaker&lt;/strong&gt; — একটা Service বারবার fail করলে বাকি সিস্টেম রক্ষা করুন।&lt;/p&gt;

&lt;p&gt;Laravel এ Redis, Queue, Database Read/Write Split ব্যবহার করে এই সব Concept সহজেই Implement করা যায়।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;Q:5&lt;/em&gt;&lt;/strong&gt; - &lt;strong&gt;Caching (Redis, Memcached)&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Answer&lt;/strong&gt;: &lt;/p&gt;

&lt;p&gt;⚡ &lt;strong&gt;Caching কী?&lt;/strong&gt;&lt;br&gt;
Caching হলো &lt;strong&gt;ঘন ঘন ব্যবহৃত ডেটা&lt;/strong&gt; দ্রুত অ্যাক্সেসের জন্য &lt;strong&gt;কাছে রেখে দেওয়া&lt;/strong&gt;। প্রতিবার Database এ না গিয়ে Cache থেকে ডেটা নিলে সিস্টেম অনেক দ্রুত হয়।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ Without Cache:
[User Request] → [Laravel] → [Database] → [Response]
                              ↑ প্রতিবার DB Hit = ধীর, ব্যয়বহুল

✅ With Cache:
[User Request] → [Laravel] → [Cache] → [Response]  ← দ্রুত!
                                ↓ না থাকলে
                           [Database] → [Cache তে রাখো] → [Response]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cache কতটা দ্রুত?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Database Query  →  10-100ms
Redis Cache     →  0.1-1ms   ← ১০০ গুণ দ্রুত!
Memcached       →  0.1-1ms   ← ১০০ গুণ দ্রুত!
Memory (Array)  →  0.001ms   ← সবচেয়ে দ্রুত কিন্তু Persistent না
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🔧 &lt;strong&gt;PART 1 — Laravel Cache Setup&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Redis Setup:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bash
&lt;span class="c"&gt;# Redis Install করুন&lt;/span&gt;
composer require predis/predis
&lt;span class="c"&gt;# অথবা PHP Redis Extension&lt;/span&gt;
pecl &lt;span class="nb"&gt;install &lt;/span&gt;redis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// .env&lt;/span&gt;
&lt;span class="no"&gt;CACHE_DRIVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;redis&lt;/span&gt;
&lt;span class="no"&gt;REDIS_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;127.0.0.1&lt;/span&gt;
&lt;span class="no"&gt;REDIS_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="no"&gt;REDIS_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6379&lt;/span&gt;
&lt;span class="no"&gt;REDIS_DB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;           &lt;span class="c1"&gt;// Cache এর জন্য&lt;/span&gt;
&lt;span class="no"&gt;REDIS_CACHE_DB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;     &lt;span class="c1"&gt;// আলাদা DB — Session এর সাথে মিশবে না&lt;/span&gt;

&lt;span class="c1"&gt;// config/cache.php&lt;/span&gt;
&lt;span class="s1"&gt;'redis'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'driver'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'redis'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'connection'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'cache'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'lock_connection'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'default'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;

&lt;span class="c1"&gt;// config/database.php — Redis Connections&lt;/span&gt;
&lt;span class="s1"&gt;'redis'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'default'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'host'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'REDIS_HOST'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s1"&gt;'password'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'REDIS_PASSWORD'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s1"&gt;'port'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'REDIS_PORT'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6379&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s1"&gt;'database'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Queue &amp;amp; General&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s1"&gt;'cache'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'host'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'REDIS_HOST'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s1"&gt;'password'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'REDIS_PASSWORD'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s1"&gt;'port'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'REDIS_PORT'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6379&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s1"&gt;'database'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Cache আলাদা DB তে&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s1"&gt;'session'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'host'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'REDIS_HOST'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s1"&gt;'password'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'REDIS_PASSWORD'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s1"&gt;'port'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'REDIS_PORT'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6379&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s1"&gt;'database'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Session আলাদা DB তে&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Memcached Setup:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bashcomposer require ext-memcached
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// .env&lt;/span&gt;
&lt;span class="no"&gt;CACHE_DRIVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;memcached&lt;/span&gt;
&lt;span class="no"&gt;MEMCACHED_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;127.0.0.1&lt;/span&gt;
&lt;span class="no"&gt;MEMCACHED_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;11211&lt;/span&gt;

&lt;span class="c1"&gt;// config/cache.php&lt;/span&gt;
&lt;span class="s1"&gt;'memcached'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'driver'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'memcached'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'servers'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'host'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'MEMCACHED_HOST'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="s1"&gt;'port'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'MEMCACHED_PORT'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11211&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="s1"&gt;'weight'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="c1"&gt;// Multiple Servers — Load Distribution&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'host'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'MEMCACHED_HOST_2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'10.0.0.2'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="s1"&gt;'port'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;11211&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'weight'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🎯 &lt;strong&gt;PART 2 — Cache Strategies (কৌশল)&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Strategy 1 — Cache-Aside (Lazy Loading)&lt;/strong&gt;&lt;br&gt;
সবচেয়ে জনপ্রিয় Pattern। &lt;strong&gt;দরকার হলে&lt;/strong&gt; Cache এ রাখা হয়।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// app/Services/ProductService.php&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ১. Basic Cache Remember&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;Product&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s2"&gt;"product:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;// Cache Key&lt;/span&gt;
            &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addHours&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;       &lt;span class="c1"&gt;// Expiry — ৬ ঘন্টা&lt;/span&gt;
            &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'brand'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'images'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;findOrFail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// ২. Cache Forever — খুব কম পরিবর্তন হয় এমন Data&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getCategories&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;Collection&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;rememberForever&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s1"&gt;'all_categories'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Category&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'is_active'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// ৩. Cache Tags — Related Cache একসাথে Clear করুন&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getProductsByCategory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$categoryId&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;Collection&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'products'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"category:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$categoryId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                        &lt;span class="s2"&gt;"products:category:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$categoryId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addHours&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                        &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'category_id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$categoryId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                                       &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'active'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                                       &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'brand'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'images'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                                       &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;orderByDesc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'created_at'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                                       &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// ৪. Stale-While-Revalidate — Cache Expire হলেও পুরনো দেখাও&lt;/span&gt;
    &lt;span class="c1"&gt;//    Background এ নতুন করো&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getPopularProducts&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;Collection&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$cacheKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'popular_products'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// Cache আছে? → দিন&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$cached&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$cacheKey&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

            &lt;span class="c1"&gt;// Cache প্রায় শেষ? → Background এ refresh করুন&lt;/span&gt;
            &lt;span class="nv"&gt;$ttl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$cacheKey&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:ttl"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ttl&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$ttl&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addMinutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nc"&gt;RefreshPopularProductsCache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$cached&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Cache নেই → DB থেকে নিন&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;refreshPopularProductsCache&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;refreshPopularProductsCache&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;Collection&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$products&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;withCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'orders'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                           &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;orderByDesc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'orders_count'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                           &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                           &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'popular_products'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$products&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addHour&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'popular_products:ttl'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addHour&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addHour&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$products&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Strategy 2 — Write-Through Cache&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Data লেখার সময়&lt;/strong&gt; একসাথে Cache ও Database Update করা।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductRepository&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Create — DB ও Cache একসাথে&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;Product&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// সাথে সাথে Cache এ রাখুন&lt;/span&gt;
        &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s2"&gt;"product:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'brand'&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
            &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addHours&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Category Cache Clear করুন&lt;/span&gt;
        &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;"category:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;category_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;forget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'popular_products'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Update — DB ও Cache একসাথে&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;Product&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;findOrFail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$oldCategoryId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;category_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;refresh&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'brand'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'images'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

        &lt;span class="c1"&gt;// Cache Update করুন&lt;/span&gt;
        &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"product:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addHours&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

        &lt;span class="c1"&gt;// Related Cache Clear করুন&lt;/span&gt;
        &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;"category:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$oldCategoryId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;category_id&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nv"&gt;$oldCategoryId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;"category:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;category_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Delete — DB ও Cache একসাথে&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;findOrFail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Cache গুলো Clear করুন&lt;/span&gt;
        &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;forget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"product:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;"category:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;category_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'products'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Strategy 3 — Write-Behind Cache (Lazy Write)&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Cache এ লিখুন&lt;/strong&gt; — Database এ পরে Sync করুন। অনেক দ্রুত।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// Counter বা Analytics এর জন্য দারুণ&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AnalyticsService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ১. View Count — Cache এ রাখুন, পরে DB Sync&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;incrementView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"product:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:views:pending"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// Redis এ Increment করুন — DB তে যাবে না এখন&lt;/span&gt;
        &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;incr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;expire&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// ৫ মিনিট পর DB Sync করুন&lt;/span&gt;
        &lt;span class="nc"&gt;SyncViewCount&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                     &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addMinutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                     &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;onQueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'analytics'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// ২. Like/Dislike — Batch এ DB তে লিখুন&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;toggleLike&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$likeKey&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"product:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:likes"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;$dislikeKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"product:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:dislikes"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;$userLikeKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:liked_products"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// User আগে Like দিয়েছে?&lt;/span&gt;
        &lt;span class="nv"&gt;$hasLiked&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;sismember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$userLikeKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$hasLiked&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Unlike করুন&lt;/span&gt;
            &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;srem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$userLikeKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;decr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$likeKey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nv"&gt;$action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'unliked'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Like করুন&lt;/span&gt;
            &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;sadd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$userLikeKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;incr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$likeKey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nv"&gt;$action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'liked'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Background এ DB Sync করুন&lt;/span&gt;
        &lt;span class="nc"&gt;SyncProductLikes&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;onQueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'analytics'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'action'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'likes'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$likeKey&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Background Sync Job&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SyncViewCount&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;ShouldQueue&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$key&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"product:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;productId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:views:pending"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;$views&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;getdel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Get and Delete atomically&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$views&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                   &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'view_count'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;$views&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🏗️ &lt;strong&gt;PART 3 — Cache Key Design (গুরুত্বপূর্ণ!)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// app/Services/CacheKeyService.php&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CacheKey&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ভালো Cache Key Design — Hierarchical&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="no"&gt;VERSION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'v1'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Schema change হলে version বাড়ান&lt;/span&gt;

    &lt;span class="c1"&gt;// Product Keys&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;VERSION&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;":product:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;productList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$filters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]):&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$filterHash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;md5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$filters&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Filters এর Hash&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;VERSION&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;":products:list:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$filterHash&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;productsByCategory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$catId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;VERSION&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;":products:cat:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$catId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:page:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$page&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// User Keys&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;userProfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;VERSION&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;":user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:profile"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;userCart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;VERSION&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;":user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:cart"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;userPermissions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;VERSION&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;":user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:permissions"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Config Keys&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;siteSettings&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;VERSION&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;":config:site_settings"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ব্যবহার&lt;/span&gt;
&lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CacheKey&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CacheKey&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;userCart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;1800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Cart&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;forUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// ❌ ভুল Cache Key Design&lt;/span&gt;
&lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'product'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;          &lt;span class="c1"&gt;// Collision!&lt;/span&gt;
&lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"product_&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;      &lt;span class="c1"&gt;// Version নেই&lt;/span&gt;
&lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"p_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;          &lt;span class="c1"&gt;// বোঝা যাচ্ছে না&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🔴 &lt;strong&gt;PART 4 — Redis Advanced Features&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Redis Data Structures — Laravel এ:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// ১. String — Simple Value Store&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'app:version'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2.5.1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'otp:01712345678'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'123456'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ৫ মিনিট&lt;/span&gt;
&lt;span class="nv"&gt;$otp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'otp:01712345678'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ২. Hash — Object Store (User Session এর মতো)&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;hmset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"cart:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'items_count'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'total'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'coupon'&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'SAVE20'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'updated_at'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="c1"&gt;// একটা field update&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;hset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"cart:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'items_count'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// সব field পড়ুন&lt;/span&gt;
&lt;span class="nv"&gt;$cart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;hgetall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"cart:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ৩. List — Queue / Recent Items&lt;/span&gt;
&lt;span class="c1"&gt;// Left Push — নতুন item সামনে&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;lpush&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:recent_products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// List এর size limit — শুধু ১০টা রাখুন&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;ltrim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:recent_products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// সব recent products&lt;/span&gt;
&lt;span class="nv"&gt;$recentProducts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;lrange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:recent_products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ৪. Set — Unique Values (Tags, Followers)&lt;/span&gt;
&lt;span class="c1"&gt;// Product Tags&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;sadd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"product:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:tags"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'smartphone'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'apple'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'5g'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// User Wishlist&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;sadd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:wishlist"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;srem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:wishlist"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Remove&lt;/span&gt;

&lt;span class="c1"&gt;// Wishlist এ আছে?&lt;/span&gt;
&lt;span class="nv"&gt;$inWishlist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;sismember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:wishlist"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Common Products (Intersection) — দুজনের Common Wishlist&lt;/span&gt;
&lt;span class="nv"&gt;$commonWishlist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;sinter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;"user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$user1Id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:wishlist"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$user2Id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:wishlist"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ৫. Sorted Set — Leaderboard / Ranking&lt;/span&gt;
&lt;span class="c1"&gt;// Sales Score যোগ করুন&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;zadd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'leaderboard:products:weekly'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'iPhone 15'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'Samsung S24'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'MacBook Pro'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="c1"&gt;// Score বাড়ান&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;zincrby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'leaderboard:products:weekly'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'iPhone 15'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Top 10 Products&lt;/span&gt;
&lt;span class="nv"&gt;$topProducts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;zrevrange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s1"&gt;'leaderboard:products:weekly'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'WITHSCORES'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Rank জানুন&lt;/span&gt;
&lt;span class="nv"&gt;$rank&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;zrevrank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'leaderboard:products:weekly'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'iPhone 15'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ৬. HyperLogLog — Unique Visitor Count (Memory দক্ষ)&lt;/span&gt;
&lt;span class="c1"&gt;// প্রতিটা Visitor এর IP যোগ করুন&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;pfadd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"page:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$pageId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:visitors:today"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="c1"&gt;// Approximate unique count (৯৯.৫% accurate, মাত্র ১২KB memory!)&lt;/span&gt;
&lt;span class="nv"&gt;$uniqueVisitors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;pfcount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"page:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$pageId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:visitors:today"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ৭. Pub/Sub — Real-time Notification&lt;/span&gt;
&lt;span class="c1"&gt;// Publisher&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'notifications'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="s1"&gt;'user_id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'message'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'আপনার Order Confirm হয়েছে!'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'type'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'order_confirmed'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]));&lt;/span&gt;

&lt;span class="c1"&gt;// Subscriber (Artisan Command হিসেবে চালান)&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'notifications'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;json_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// WebSocket দিয়ে User কে পাঠান&lt;/span&gt;
    &lt;span class="nf"&gt;broadcast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UserNotification&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Redis Pipeline — Multiple Commands একসাথে:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// ❌ ধীর — প্রতিটা Command আলাদা Network Trip&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'key1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'value1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'key2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'value2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'key3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'value3'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;expire&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'key1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;expire&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'key2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ✅ দ্রুত — একটাই Network Trip এ সব&lt;/span&gt;
&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;pipeline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$pipe&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$pipe&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'key1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'value1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$pipe&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'key2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'value2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$pipe&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'key3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'value3'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$pipe&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;expire&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'key1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$pipe&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;expire&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'key2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Real Example — User Login Cache&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;cacheUserData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;User&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;pipeline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$pipe&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// User Profile&lt;/span&gt;
        &lt;span class="nv"&gt;$pipe&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s2"&gt;"user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:profile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nb"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;toArray&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Permissions&lt;/span&gt;
        &lt;span class="nv"&gt;$pipe&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s2"&gt;"user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:permissions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nb"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getAllPermissions&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;pluck&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Last Login Update&lt;/span&gt;
        &lt;span class="nv"&gt;$pipe&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;hset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s2"&gt;"user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:meta"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'last_login'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Online Status&lt;/span&gt;
        &lt;span class="nv"&gt;$pipe&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:online"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Redis Lua Script — Atomic Operations:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// Atomic Stock Deduction — Race Condition ছাড়া&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AtomicStockService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;deductStock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$quantity&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$script&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"
            local stock = tonumber(redis.call('get', KEYS[1]))
            if stock == nil then
                return -1  -- Stock Cache নেই
            end
            if stock &amp;lt; tonumber(ARGV[1]) then
                return 0   -- Stock কম
            end
            redis.call('decrby', KEYS[1], ARGV[1])
            return 1       -- সফল
        "&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="nv"&gt;$result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="k"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nv"&gt;$script&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                              &lt;span class="c1"&gt;// Key count&lt;/span&gt;
            &lt;span class="s2"&gt;"product:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:stock"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// KEYS[1]&lt;/span&gt;
            &lt;span class="nv"&gt;$quantity&lt;/span&gt;                       &lt;span class="c1"&gt;// ARGV[1]&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="mi"&gt;0&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InsufficientStockException&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;deductFromDatabase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$quantity&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🔵 &lt;strong&gt;PART 5 — Memcached&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Redis vs Memcached কখন কোনটা?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Redis&lt;/span&gt;                          &lt;span class="nc"&gt;Memcached&lt;/span&gt;
&lt;span class="err"&gt;─────────────────────&lt;/span&gt;          &lt;span class="err"&gt;─────────────────────&lt;/span&gt;
&lt;span class="nc"&gt;Data&lt;/span&gt; &lt;span class="nc"&gt;Structures&lt;/span&gt; &lt;span class="n"&gt;আছ&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;      &lt;span class="n"&gt;vs&lt;/span&gt;   &lt;span class="n"&gt;শ&lt;/span&gt;&lt;span class="err"&gt;ু&lt;/span&gt;&lt;span class="n"&gt;ধ&lt;/span&gt;&lt;span class="err"&gt;ু&lt;/span&gt; &lt;span class="nc"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;Value&lt;/span&gt;
&lt;span class="nc"&gt;Persistence&lt;/span&gt; &lt;span class="n"&gt;আছ&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;          &lt;span class="n"&gt;vs&lt;/span&gt;   &lt;span class="nc"&gt;Memory&lt;/span&gt; &lt;span class="nf"&gt;Only&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Restart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Data&lt;/span&gt; &lt;span class="n"&gt;হ&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;র&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;য&lt;/span&gt;&lt;span class="err"&gt;়&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nc"&gt;Pub&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nc"&gt;Sub&lt;/span&gt; &lt;span class="n"&gt;আছ&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;              &lt;span class="n"&gt;vs&lt;/span&gt;   &lt;span class="n"&gt;ন&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;&lt;span class="n"&gt;ই&lt;/span&gt;
&lt;span class="nc"&gt;Replication&lt;/span&gt; &lt;span class="n"&gt;আছ&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;          &lt;span class="n"&gt;vs&lt;/span&gt;   &lt;span class="n"&gt;ন&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;&lt;span class="n"&gt;ই&lt;/span&gt;
&lt;span class="n"&gt;ব&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;&lt;span class="n"&gt;শ&lt;/span&gt;&lt;span class="err"&gt;ি&lt;/span&gt; &lt;span class="nc"&gt;Features&lt;/span&gt;            &lt;span class="n"&gt;vs&lt;/span&gt;   &lt;span class="nc"&gt;Simple&lt;/span&gt; &lt;span class="n"&gt;ও&lt;/span&gt; &lt;span class="n"&gt;দ&lt;/span&gt;&lt;span class="err"&gt;্&lt;/span&gt;&lt;span class="n"&gt;র&lt;/span&gt;&lt;span class="err"&gt;ু&lt;/span&gt;&lt;span class="n"&gt;ত&lt;/span&gt;
&lt;span class="nc"&gt;Cache&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nc"&gt;Queue&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nc"&gt;Session&lt;/span&gt;  &lt;span class="n"&gt;vs&lt;/span&gt;   &lt;span class="n"&gt;শ&lt;/span&gt;&lt;span class="err"&gt;ু&lt;/span&gt;&lt;span class="n"&gt;ধ&lt;/span&gt;&lt;span class="err"&gt;ু&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;কখন Memcached বেছে নেবেন&lt;/strong&gt;:&lt;br&gt;
✓ শুধু Simple Caching দরকার&lt;br&gt;
✓ Multi-threaded Performance দরকার&lt;br&gt;
✓ Very Large Cache (কয়েক TB)&lt;br&gt;
✓ Simple Setup চান&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php
// Memcached Operations — Laravel এ একই Cache Facade
Cache::store('memcached')-&amp;gt;put('key', 'value', 3600);
Cache::store('memcached')-&amp;gt;get('key');
Cache::store('memcached')-&amp;gt;forget('key');

// Multiple Servers — Consistent Hashing
// config/cache.php
'memcached' =&amp;gt; [
    'driver'        =&amp;gt; 'memcached',
    'persistent_id' =&amp;gt; env('MEMCACHED_PERSISTENT_ID'),
    'sasl'          =&amp;gt; [
        env('MEMCACHED_USERNAME'),
        env('MEMCACHED_PASSWORD'),
    ],
    'options' =&amp;gt; [
        // Consistent Hashing — Server যোগ/বাদ দিলে কম Cache Miss
        Memcached::OPT_DISTRIBUTION =&amp;gt; Memcached::DISTRIBUTION_CONSISTENT,
        Memcached::OPT_LIBKETAMA_COMPATIBLE =&amp;gt; true,
    ],
    'servers' =&amp;gt; [
        ['host' =&amp;gt; '10.0.0.1', 'port' =&amp;gt; 11211, 'weight' =&amp;gt; 100],
        ['host' =&amp;gt; '10.0.0.2', 'port' =&amp;gt; 11211, 'weight' =&amp;gt; 100],
        ['host' =&amp;gt; '10.0.0.3', 'port' =&amp;gt; 11211, 'weight' =&amp;gt; 100],
    ],
],
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🛡️ &lt;strong&gt;PART 6 — Cache Problems &amp;amp; Solutions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;১. Cache Stampede (Thunder Herd Problem):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;সমস&lt;/span&gt;&lt;span class="err"&gt;্&lt;/span&gt;&lt;span class="n"&gt;য&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt; &lt;span class="nc"&gt;Expire&lt;/span&gt; &lt;span class="n"&gt;হল&lt;/span&gt;&lt;span class="err"&gt;ো&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;হ&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;জ&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;র&lt;/span&gt;&lt;span class="err"&gt;ো&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt; &lt;span class="n"&gt;একস&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;থ&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt; &lt;span class="n"&gt;ত&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt; &lt;span class="n"&gt;গ&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;&lt;span class="n"&gt;ল&lt;/span&gt;&lt;span class="err"&gt;ো&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt; &lt;span class="nc"&gt;Crash&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;

                &lt;span class="nc"&gt;Cache&lt;/span&gt; &lt;span class="nc"&gt;Expire&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
                     &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="nc"&gt;Requests&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;──→&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="n"&gt;অন&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;&lt;span class="n"&gt;ক&lt;/span&gt; &lt;span class="n"&gt;চ&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;প&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// Solution 1 — Mutex/Lock ব্যবহার করুন&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CacheStampedeProtection&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$ttl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;callable&lt;/span&gt; &lt;span class="nv"&gt;$callback&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;mixed&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Cache আছে? দিন&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Lock নিন — শুধু একজন DB তে যাবে&lt;/span&gt;
        &lt;span class="nv"&gt;$lock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"lock:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$lock&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;// আমি Lock পেয়েছি — DB থেকে নিই&lt;/span&gt;
                &lt;span class="nv"&gt;$value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$callback&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$ttl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$lock&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;release&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Lock পাইনি — একটু অপেক্ষা করে আবার চেক করুন&lt;/span&gt;
        &lt;span class="nb"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="nv"&gt;$callback&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Solution 2 — Probabilistic Early Expiration&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EarlyExpirationCache&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$ttl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;callable&lt;/span&gt; &lt;span class="nv"&gt;$callback&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;mixed&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$cached&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$cached&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// TTL এর ১০% বাকি থাকলে ১% chance এ early refresh&lt;/span&gt;
            &lt;span class="nv"&gt;$remainingTtl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;ttl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nv"&gt;$shouldRefresh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$remainingTtl&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ttl&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                          &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;random_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$shouldRefresh&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$cached&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nv"&gt;$value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$callback&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$ttl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;২. Cache Penetration (DB Attack):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;সমস&lt;/span&gt;&lt;span class="err"&gt;্&lt;/span&gt;&lt;span class="n"&gt;য&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Hacker&lt;/span&gt; &lt;span class="n"&gt;ব&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;রব&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;র&lt;/span&gt; &lt;span class="nc"&gt;Non&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;existent&lt;/span&gt; &lt;span class="nc"&gt;Key&lt;/span&gt; &lt;span class="n"&gt;দ&lt;/span&gt;&lt;span class="err"&gt;ি&lt;/span&gt;&lt;span class="n"&gt;য&lt;/span&gt;&lt;span class="err"&gt;়ে&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt; &lt;span class="n"&gt;করছ&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;
&lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt; &lt;span class="nc"&gt;Miss&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt; &lt;span class="nc"&gt;Hit&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt; &lt;span class="nc"&gt;Overwhelmed&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;

&lt;span class="no"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;99999999&lt;/span&gt;  &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="n"&gt;এই&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt; &lt;span class="n"&gt;ন&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;&lt;span class="n"&gt;ই&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;span class="no"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;88888888&lt;/span&gt;  &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="n"&gt;এট&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;ও&lt;/span&gt; &lt;span class="n"&gt;ন&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;&lt;span class="n"&gt;ই&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;span class="mf"&gt;...&lt;/span&gt; &lt;span class="n"&gt;লক&lt;/span&gt;&lt;span class="err"&gt;্&lt;/span&gt;&lt;span class="n"&gt;ষব&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;র&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="c1"&gt;// Solution — Null Value Cache করুন&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;?Product&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$cacheKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"product:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="nv"&gt;$cached&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$cacheKey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Null String মানে আগে চেক করা হয়েছে, নেই&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$cached&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;'NULL'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$cached&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$cached&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// DB তে খুঁজুন&lt;/span&gt;
        &lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$cacheKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addHours&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// নেই → Null Cache করুন — ৫ মিনিটের জন্য&lt;/span&gt;
            &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$cacheKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'NULL'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addMinutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Bloom Filter — আরো ভালো Solution&lt;/span&gt;
&lt;span class="c1"&gt;// সব Valid Product ID Redis এ রাখুন&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BloomFilterService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;productExists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Bloom Filter Check — O(1) time&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;getbit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"bloom:products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$productId&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;10000000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;addProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$productId&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setbit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"bloom:products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$productId&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;10000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Middleware তে ব্যবহার করুন&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;BloomFilterService&lt;/span&gt; &lt;span class="nv"&gt;$bloom&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;JsonResponse&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Bloom Filter এ নেই → সরাসরি 404, DB তে যাবে না&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$bloom&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;productExists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'message'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Not found'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;productService&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;৩. Cache Avalanche (একসাথে অনেক Cache Expire):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;সমস&lt;/span&gt;&lt;span class="err"&gt;্&lt;/span&gt;&lt;span class="n"&gt;য&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;র&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;ত&lt;/span&gt; &lt;span class="err"&gt;১২&lt;/span&gt;&lt;span class="n"&gt;ট&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;য&lt;/span&gt;&lt;span class="err"&gt;়&lt;/span&gt; &lt;span class="n"&gt;সব&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt; &lt;span class="nc"&gt;Expire&lt;/span&gt; &lt;span class="n"&gt;হল&lt;/span&gt;&lt;span class="err"&gt;ো&lt;/span&gt;
&lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;সব&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt; &lt;span class="n"&gt;ত&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt; &lt;span class="n"&gt;গ&lt;/span&gt;&lt;span class="err"&gt;ে&lt;/span&gt;&lt;span class="n"&gt;ল&lt;/span&gt;&lt;span class="err"&gt;ো&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt; &lt;span class="nc"&gt;Down&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;php&lt;br&gt;
// Solution — TTL তে Random Jitter যোগ করুন&lt;br&gt;
class CacheService&lt;br&gt;
{&lt;br&gt;
    // সব Cache একসাথে Expire না হওয়ার জন্য&lt;br&gt;
    public function rememberWithJitter(&lt;br&gt;
        string $key,&lt;br&gt;
        int $baseTtl,&lt;br&gt;
        callable $callback,&lt;br&gt;
        int $jitterPercent = 20&lt;br&gt;
    ): mixed {&lt;br&gt;
        // Base TTL এর ±20% Random করুন&lt;br&gt;
        $jitter = (int) ($baseTtl * $jitterPercent / 100);&lt;br&gt;
        $ttl    = $baseTtl + random_int(-$jitter, $jitter);&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    return Cache::remember($key, $ttl, $callback);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;// ব্যবহার&lt;br&gt;
// ৩৬০০ সেকেন্ড (±২০%) = ২৮৮০ থেকে ৪৩২০ সেকেন্ডের মধ্যে যেকোনো সময় expire&lt;br&gt;
$product = $cacheService-&amp;gt;rememberWithJitter(&lt;br&gt;
    "product:{$id}",&lt;br&gt;
    3600,&lt;br&gt;
    fn() =&amp;gt; Product::find($id)&lt;br&gt;
);&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;
&lt;span class="o"&gt;---&lt;/span&gt;

&lt;span class="err"&gt;📊&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="no"&gt;PART&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="nc"&gt;Full&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt; &lt;span class="nc"&gt;Layer&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="nc"&gt;Real&lt;/span&gt; &lt;span class="nc"&gt;Project&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;php&lt;br&gt;
// app/Services/CacheLayerService.php&lt;br&gt;
// সব ধরনের Cache একটা Service এ&lt;/p&gt;

&lt;p&gt;class CacheLayerService&lt;br&gt;
{&lt;br&gt;
    // L1: Array Cache (Request scope — সবচেয়ে দ্রুত)&lt;br&gt;
    private array $requestCache = [];&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// L2: Redis (Application scope)
// L3: Database (সবচেয়ে ধীর)

public function getProduct(int $id): ?Product
{
    // L1 — Same Request এ আগে দেখা? Array থেকে নিন
    if (isset($this-&amp;gt;requestCache["product:{$id}"])) {
        return $this-&amp;gt;requestCache["product:{$id}"];
    }

    // L2 — Redis Cache তে আছে?
    $product = Cache::remember(
        CacheKey::product($id),
        now()-&amp;gt;addHours(6),
        function () use ($id) {
            // L3 — Database থেকে নিন
            return Product::with(['category', 'brand', 'images'])
                          -&amp;gt;find($id);
        }
    );

    // L1 এ রাখুন — এই Request এ আবার লাগলে দ্রুত পাবো
    $this-&amp;gt;requestCache["product:{$id}"] = $product;

    return $product;
}

// Dashboard Cache — Multiple Data একসাথে
public function getDashboardData(int $userId): array
{
    return Cache::remember(
        "dashboard:user:{$userId}",
        now()-&amp;gt;addMinutes(15),
        function () use ($userId) {
            // সব Data একসাথে Load করুন
            return [
                'total_orders'    =&amp;gt; Order::where('user_id', $userId)-&amp;gt;count(),
                'pending_orders'  =&amp;gt; Order::where('user_id', $userId)
                                          -&amp;gt;where('status', 'pending')-&amp;gt;count(),
                'total_spent'     =&amp;gt; Order::where('user_id', $userId)
                                          -&amp;gt;where('status', 'completed')
                                          -&amp;gt;sum('total'),
                'wishlist_count'  =&amp;gt; Wishlist::where('user_id', $userId)-&amp;gt;count(),
                'recent_orders'   =&amp;gt; Order::where('user_id', $userId)
                                          -&amp;gt;with('items.product')
                                          -&amp;gt;latest()
                                          -&amp;gt;take(5)
                                          -&amp;gt;get(),
                'recommended'     =&amp;gt; $this-&amp;gt;getRecommendations($userId),
            ];
        }
    );
}

// Cache Warming — Deploy এর পরে Cache গরম করুন
public function warmCache(): void
{
    // Popular Products Cache করুন
    $popularProducts = Product::withCount('orders')
                              -&amp;gt;orderByDesc('orders_count')
                              -&amp;gt;take(100)
                              -&amp;gt;get();

    foreach ($popularProducts as $product) {
        Cache::put(
            CacheKey::product($product-&amp;gt;id),
            $product-&amp;gt;load(['category', 'brand']),
            now()-&amp;gt;addHours(6)
        );
    }

    // Categories Cache করুন
    Cache::put(
        'all_categories',
        Category::where('is_active', true)-&amp;gt;get(),
        now()-&amp;gt;addDay()
    );

    Log::info('Cache warmed successfully', [
        'products_cached' =&amp;gt; $popularProducts-&amp;gt;count()
    ]);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;// Artisan Command — Deploy এর পরে Cache Warm করুন&lt;br&gt;
class WarmCacheCommand extends Command&lt;br&gt;
{&lt;br&gt;
    protected $signature   = 'cache:warm';&lt;br&gt;
    protected $description = 'Warm application cache after deployment';&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function handle(CacheLayerService $cacheService): void
{
    $this-&amp;gt;info('Cache warming শুরু হচ্ছে...');

    $start = microtime(true);
    $cacheService-&amp;gt;warmCache();
    $time  = round(microtime(true) - $start, 2);

    $this-&amp;gt;info("✅ Cache warming সম্পন্ন! সময় লেগেছে: {$time}s");
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
// চালান: php artisan cache:warm&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
---

📈 **PART 8 — Cache Monitoring**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;php&lt;br&gt;
// Cache Hit Rate Monitor করুন&lt;br&gt;
class CacheMonitorMiddleware&lt;br&gt;
{&lt;br&gt;
    public function handle(Request $request, Closure $next): Response&lt;br&gt;
    {&lt;br&gt;
        // Cache Event Listen করুন&lt;br&gt;
        Event::listen(CacheHit::class, function ($event) {&lt;br&gt;
            Redis::incr('metrics:cache:hits');&lt;br&gt;
        });&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Event::listen(CacheMissed::class, function ($event) {
        Redis::incr('metrics:cache:misses');
    });

    return $next($request);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;// Cache Stats দেখুন&lt;br&gt;
class CacheStatsController extends Controller&lt;br&gt;
{&lt;br&gt;
    public function stats(): JsonResponse&lt;br&gt;
    {&lt;br&gt;
        $hits   = (int) Redis::get('metrics:cache:hits') ?? 0;&lt;br&gt;
        $misses = (int) Redis::get('metrics:cache:misses') ?? 0;&lt;br&gt;
        $total  = $hits + $misses;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    $info   = Redis::info('memory');

    return response()-&amp;gt;json([
        'hit_rate'    =&amp;gt; $total &amp;gt; 0
                          ? round($hits / $total * 100, 2) . '%'
                          : '0%',
        'total_hits'  =&amp;gt; $hits,
        'total_misses'=&amp;gt; $misses,
        'memory_used' =&amp;gt; $info['used_memory_human'],
        'memory_peak' =&amp;gt; $info['used_memory_peak_human'],
    ]);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
---

📝 **সংক্ষেপে মনে রাখুন**
**Cache কেন** — Database চাপ কমাতে এবং Response দ্রুত করতে। 
**Redis** — Cache ছাড়াও Queue, Session, Pub/Sub, Leaderboard সব করা যায় — Laravel এ সবচেয়ে জনপ্রিয়। 
**Memcached** — শুধু Simple Caching দরকার হলে এবং Multi-threaded Performance দরকার হলে। 
**Cache Strategies** — Cache-Aside সবচেয়ে জনপ্রিয়, Write-Through Critical Data এর জন্য, Write-Behind Analytics এর জন্য। 
**সমস্যাগুলো** — Stampede (Lock দিয়ে), Penetration (Null Cache দিয়ে), Avalanche (Jitter দিয়ে) সমাধান করুন।
Real Project এ **Redis** ব্যবহার করুন — এটাই যথেষ্ট। Cache Key Design ভালো রাখুন এবং Cache Invalidation সতর্কভাবে করুন।

**_Q:6_** - Security (OAuth2, JWT, encryption)
**Answer:**

🔐 **Security কেন গুরুত্বপূর্ণ?**

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;একটা Security Breach এর পরিণাম:&lt;br&gt;
├── User এর Personal Data চুরি&lt;br&gt;
├── Financial Loss&lt;br&gt;
├── Company এর Reputation নষ্ট&lt;br&gt;
├── Legal Penalty (GDPR Fine)&lt;br&gt;
└── Service Down&lt;/p&gt;

&lt;p&gt;বাস্তব উদাহরণ:&lt;br&gt;
2013 → Adobe: 38 মিলিয়ন User Data চুরি&lt;br&gt;
2016 → Uber: 57 মিলিয়ন User Data চুরি&lt;br&gt;
2021 → Facebook: 533 মিলিয়ন User Data Leak&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
---

🔵 **PART 1 — Authentication vs Authorization**

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Authentication (প্রমাণ)     Authorization (অনুমতি)&lt;br&gt;
────────────────────────    ────────────────────────&lt;br&gt;
"তুমি কে?"             vs  "তুমি কী করতে পারবে?"&lt;/p&gt;

&lt;p&gt;Login করা              vs  Admin Panel Access&lt;br&gt;
Password Check         vs  Role Permission Check&lt;br&gt;
JWT Token Verify       vs  Policy Check&lt;/p&gt;

&lt;p&gt;উদাহরণ:&lt;br&gt;
আপনি Bank এ গেলেন      → Authentication (NID দেখালেন)&lt;br&gt;
Locker Room এ গেলেন    → Authorization (আপনার Locker নম্বর আছে)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
---

🟡 **PART 2 — JWT (JSON Web Token)**
**JWT কী?**
JWT হলো একটা **Self-contained Token** — যেখানে User এর তথ্য **Encoded** থাকে। Server কে Database এ যেতে হয় না Token Verify করতে।

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JWT Structure — তিনটা Part, Dot দিয়ে আলাদা:&lt;/p&gt;

&lt;p&gt;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9    ← Header (Base64)&lt;br&gt;
.eyJ1c2VyX2lkIjoxLCJlbWFpbCI6InRlc3Q   ← Payload (Base64)&lt;br&gt;
.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV    ← Signature (HMAC)&lt;/p&gt;

&lt;p&gt;Header:  {"alg": "HS256", "typ": "JWT"}&lt;br&gt;
Payload: {"user_id": 1, "email": "&lt;a href="mailto:test@example.com"&gt;test@example.com&lt;/a&gt;", "exp": 1700000000}&lt;br&gt;
Signature: HMACSHA256(header + payload, SECRET_KEY)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Laravel-এ JWT Implementation:**

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;bash&lt;br&gt;
composer require php-open-source-saver/jwt-auth&lt;br&gt;
php artisan vendor:publish --provider="PHPOpenSourceSaver\JWTAuth\Providers\LaravelServiceProvider"&lt;br&gt;
php artisan jwt:secret&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;php&lt;br&gt;
// .env&lt;br&gt;
JWT_SECRET=your-super-secret-key-minimum-32-characters&lt;br&gt;
JWT_TTL=60          // Access Token — ৬০ মিনিট&lt;br&gt;
JWT_REFRESH_TTL=20160  // Refresh Token — ১৪ দিন&lt;/p&gt;

&lt;p&gt;// config/auth.php&lt;br&gt;
'guards' =&amp;gt; [&lt;br&gt;
    'api' =&amp;gt; [&lt;br&gt;
        'driver'   =&amp;gt; 'jwt',&lt;br&gt;
        'provider' =&amp;gt; 'users',&lt;br&gt;
    ],&lt;br&gt;
],&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="no"&gt;JWT&lt;/span&gt; &lt;span class="nc"&gt;Auth&lt;/span&gt; &lt;span class="nc"&gt;Controller&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="nc"&gt;Complete&lt;/span&gt; &lt;span class="nc"&gt;Implementation&lt;/span&gt;&lt;span class="o"&gt;:**&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;php&lt;br&gt;
// app/Http/Controllers/Api/AuthController.php&lt;br&gt;
class AuthController extends Controller&lt;br&gt;
{&lt;br&gt;
    // ১. Register&lt;br&gt;
    public function register(RegisterRequest $request): JsonResponse&lt;br&gt;
    {&lt;br&gt;
        $user = User::create([&lt;br&gt;
            'name'     =&amp;gt; $request-&amp;gt;name,&lt;br&gt;
            'email'    =&amp;gt; $request-&amp;gt;email,&lt;br&gt;
            'password' =&amp;gt; bcrypt($request-&amp;gt;password),&lt;br&gt;
        ]);&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    // Token Generate করুন
    $token = auth('api')-&amp;gt;login($user);

    return $this-&amp;gt;respondWithToken($token, $user, 201);
}

// ২. Login
public function login(LoginRequest $request): JsonResponse
{
    $credentials = $request-&amp;gt;only('email', 'password');

    // Brute Force Protection
    if ($this-&amp;gt;hasTooManyLoginAttempts($request)) {
        return response()-&amp;gt;json([
            'message' =&amp;gt; 'অনেকবার চেষ্টা করেছেন। ১৫ মিনিট পরে try করুন।',
            'retry_after' =&amp;gt; $this-&amp;gt;limiter-&amp;gt;availableIn(
                $this-&amp;gt;throttleKey($request)
            ),
        ], 429);
    }

    if (!$token = auth('api')-&amp;gt;attempt($credentials)) {
        // Failed Attempt Count বাড়ান
        $this-&amp;gt;incrementLoginAttempts($request);

        return response()-&amp;gt;json([
            'message' =&amp;gt; 'Email বা Password ভুল।',
        ], 401);
    }

    // Success — Attempt Reset করুন
    $this-&amp;gt;clearLoginAttempts($request);

    // Login Log রাখুন
    $this-&amp;gt;logLoginActivity($request);

    return $this-&amp;gt;respondWithToken($token);
}

// ৩. Logout
public function logout(): JsonResponse
{
    // Token Blacklist এ রাখুন
    auth('api')-&amp;gt;logout();

    return response()-&amp;gt;json([
        'message' =&amp;gt; 'সফলভাবে Logout হয়েছেন।'
    ]);
}

// ৪. Token Refresh
public function refresh(): JsonResponse
{
    try {
        $newToken = auth('api')-&amp;gt;refresh();
        return $this-&amp;gt;respondWithToken($newToken);

    } catch (TokenExpiredException $e) {
        return response()-&amp;gt;json([
            'message' =&amp;gt; 'Refresh Token Expired। আবার Login করুন।'
        ], 401);
    }
}

// ৫. Current User
public function me(): JsonResponse
{
    $user = auth('api')-&amp;gt;user();

    return response()-&amp;gt;json([
        'user' =&amp;gt; new UserResource($user),
    ]);
}

// Token Response Format
private function respondWithToken(
    string $token,
    ?User $user = null,
    int $status = 200
): JsonResponse {
    $user ??= auth('api')-&amp;gt;user();

    return response()-&amp;gt;json([
        'access_token' =&amp;gt; $token,
        'token_type'   =&amp;gt; 'Bearer',
        'expires_in'   =&amp;gt; auth('api')-&amp;gt;factory()-&amp;gt;getTTL() * 60,
        'user'         =&amp;gt; new UserResource($user),
    ], $status);
}

// Login Activity Log
private function logLoginActivity(Request $request): void
{
    LoginActivity::create([
        'user_id'    =&amp;gt; auth('api')-&amp;gt;id(),
        'ip_address' =&amp;gt; $request-&amp;gt;ip(),
        'user_agent' =&amp;gt; $request-&amp;gt;userAgent(),
        'location'   =&amp;gt; $this-&amp;gt;getLocationFromIp($request-&amp;gt;ip()),
        'logged_at'  =&amp;gt; now(),
    ]);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**JWT Middleware — Token Verify করুন:**

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;php&lt;br&gt;
// app/Http/Middleware/JwtMiddleware.php&lt;br&gt;
class JwtMiddleware&lt;br&gt;
{&lt;br&gt;
    public function handle(Request $request, Closure $next): Response&lt;br&gt;
    {&lt;br&gt;
        try {&lt;br&gt;
            // Token থেকে User নিন&lt;br&gt;
            $user = JWTAuth::parseToken()-&amp;gt;authenticate();&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        if (!$user) {
            return response()-&amp;gt;json([
                'message' =&amp;gt; 'User not found'
            ], 401);
        }

        // User Active আছে?
        if (!$user-&amp;gt;is_active) {
            return response()-&amp;gt;json([
                'message' =&amp;gt; 'আপনার Account Suspended।'
            ], 403);
        }

    } catch (TokenExpiredException $e) {
        return response()-&amp;gt;json([
            'message' =&amp;gt; 'Token Expired। Refresh করুন।',
            'error'   =&amp;gt; 'token_expired',
        ], 401);

    } catch (TokenInvalidException $e) {
        return response()-&amp;gt;json([
            'message' =&amp;gt; 'Token Invalid।',
            'error'   =&amp;gt; 'token_invalid',
        ], 401);

    } catch (JWTException $e) {
        return response()-&amp;gt;json([
            'message' =&amp;gt; 'Token দেওয়া হয়নি।',
            'error'   =&amp;gt; 'token_absent',
        ], 401);
    }

    return $next($request);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nc"&gt;Access&lt;/span&gt; &lt;span class="nc"&gt;Token&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nc"&gt;Refresh&lt;/span&gt; &lt;span class="nc"&gt;Token&lt;/span&gt; &lt;span class="nc"&gt;Pattern&lt;/span&gt;&lt;span class="o"&gt;:**&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;php&lt;br&gt;
// app/Services/TokenService.php&lt;br&gt;
class TokenService&lt;br&gt;
{&lt;br&gt;
    // Short-lived Access Token + Long-lived Refresh Token&lt;br&gt;
    public function generateTokenPair(User $user): array&lt;br&gt;
    {&lt;br&gt;
        // Access Token — ১৫ মিনিট&lt;br&gt;
        $accessToken = JWTAuth::customClaims([&lt;br&gt;
            'type'    =&amp;gt; 'access',&lt;br&gt;
            'user_id' =&amp;gt; $user-&amp;gt;id,&lt;br&gt;
        ])-&amp;gt;fromUser($user);&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    // Refresh Token — ৩০ দিন (DB তে Store করুন)
    $refreshToken = Str::random(64);

    // DB তে Refresh Token Store করুন
    RefreshToken::create([
        'user_id'    =&amp;gt; $user-&amp;gt;id,
        'token'      =&amp;gt; hash('sha256', $refreshToken), // Hash করে রাখুন
        'expires_at' =&amp;gt; now()-&amp;gt;addDays(30),
        'ip_address' =&amp;gt; request()-&amp;gt;ip(),
    ]);

    return [
        'access_token'  =&amp;gt; $accessToken,
        'refresh_token' =&amp;gt; $refreshToken,
        'expires_in'    =&amp;gt; 900, // ১৫ মিনিট
    ];
}

// Refresh Token দিয়ে নতুন Access Token নিন
public function refreshAccessToken(string $refreshToken): array
{
    $hashedToken = hash('sha256', $refreshToken);

    $storedToken = RefreshToken::where('token', $hashedToken)
                               -&amp;gt;where('expires_at', '&amp;gt;', now())
                               -&amp;gt;whereNull('revoked_at')
                               -&amp;gt;with('user')
                               -&amp;gt;firstOrFail();

    // পুরনো Refresh Token Revoke করুন (Rotation)
    $storedToken-&amp;gt;update(['revoked_at' =&amp;gt; now()]);

    // নতুন Token Pair Generate করুন
    return $this-&amp;gt;generateTokenPair($storedToken-&amp;gt;user);
}

// Logout — সব Token Revoke করুন
public function revokeAllTokens(int $userId): void
{
    RefreshToken::where('user_id', $userId)
                -&amp;gt;whereNull('revoked_at')
                -&amp;gt;update(['revoked_at' =&amp;gt; now()]);

    JWTAuth::invalidate(JWTAuth::getToken());
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;
&lt;span class="o"&gt;---&lt;/span&gt;

&lt;span class="err"&gt;🟠&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="no"&gt;PART&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="nc"&gt;OAuth2&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;

&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nc"&gt;OAuth2&lt;/span&gt; &lt;span class="n"&gt;ক&lt;/span&gt;&lt;span class="err"&gt;ী&lt;/span&gt;&lt;span class="o"&gt;?**&lt;/span&gt;

&lt;span class="nc"&gt;OAuth2&lt;/span&gt; &lt;span class="n"&gt;হল&lt;/span&gt;&lt;span class="err"&gt;ো&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nc"&gt;Third&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;party&lt;/span&gt; &lt;span class="nc"&gt;Authorization&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;এর&lt;/span&gt; &lt;span class="nc"&gt;Standard&lt;/span&gt;&lt;span class="err"&gt;।&lt;/span&gt; &lt;span class="s2"&gt;"Google দিয়ে Login"&lt;/span&gt; &lt;span class="n"&gt;ব&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt; &lt;span class="s2"&gt;"Facebook দিয়ে Login"&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="n"&gt;এট&lt;/span&gt;&lt;span class="err"&gt;া&lt;/span&gt;&lt;span class="n"&gt;ই&lt;/span&gt; &lt;span class="nc"&gt;OAuth2&lt;/span&gt;&lt;span class="err"&gt;।&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OAuth2 Flow:&lt;/p&gt;

&lt;p&gt;[User] → "Google দিয়ে Login" → [Your App]&lt;br&gt;
                                    ↓&lt;br&gt;
                              [Google Auth Server]&lt;br&gt;
                                    ↓ (User Allow করলো)&lt;br&gt;
                              Authorization Code&lt;br&gt;
                                    ↓&lt;br&gt;
                         [Your App এ Code পাঠালো]&lt;br&gt;
                                    ↓&lt;br&gt;
                    Code দিয়ে Access Token নিন&lt;br&gt;
                                    ↓&lt;br&gt;
                    Access Token দিয়ে User Info নিন&lt;br&gt;
                                    ↓&lt;br&gt;
                           [User Logged In!]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nc"&gt;Laravel&lt;/span&gt; &lt;span class="nc"&gt;Passport&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="nc"&gt;Full&lt;/span&gt; &lt;span class="nc"&gt;OAuth2&lt;/span&gt; &lt;span class="nc"&gt;Server&lt;/span&gt;&lt;span class="o"&gt;:**&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;bash&lt;br&gt;
composer require laravel/passport&lt;br&gt;
php artisan passport:install&lt;br&gt;
php artisan passport:keys&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;php&lt;br&gt;
// app/Models/User.php&lt;br&gt;
class User extends Authenticatable&lt;br&gt;
{&lt;br&gt;
    use HasApiTokens; // Passport এর জন্য&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;// app/Providers/AppServiceProvider.php&lt;br&gt;
public function boot(): void&lt;br&gt;
{&lt;br&gt;
    // Token Expiry Configure করুন&lt;br&gt;
    Passport::tokensExpireIn(now()-&amp;gt;addMinutes(15));&lt;br&gt;
    Passport::refreshTokensExpireIn(now()-&amp;gt;addDays(30));&lt;br&gt;
    Passport::personalAccessTokensExpireIn(now()-&amp;gt;addMonths(6));&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Scopes Define করুন — Permission Level
Passport::tokensCan([
    'read-products'   =&amp;gt; 'Products দেখার অনুমতি',
    'write-products'  =&amp;gt; 'Products তৈরি/edit করার অনুমতি',
    'read-orders'     =&amp;gt; 'Orders দেখার অনুমতি',
    'write-orders'    =&amp;gt; 'Orders তৈরি করার অনুমতি',
    'admin'           =&amp;gt; 'সব কিছু করার অনুমতি',
]);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**OAuth2 Client Credentials (Machine to Machine):**

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
php&lt;br&gt;
// routes/api.php&lt;br&gt;
Route::middleware('client')-&amp;gt;group(function () {&lt;br&gt;
    // শুধু Authenticated Client Access করতে পারবে&lt;br&gt;
    Route::get('/internal/products', [InternalProductController::class, 'index']);&lt;br&gt;
    Route::post('/internal/sync', [SyncController::class, 'sync']);&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;// Client Credentials Grant — Service to Service Auth&lt;br&gt;
class InternalSyncService&lt;br&gt;
{&lt;br&gt;
    private ?string $accessToken = null;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function getToken(): string
{
    // Cache করুন — বারবার নেওয়া লাগবে না
    if ($this-&amp;gt;accessToken &amp;amp;&amp;amp; !$this-&amp;gt;isTokenExpired()) {
        return $this-&amp;gt;accessToken;
    }

    $response = Http::post(config('services.auth.url') . '/oauth/token', [
        'grant_type'    =&amp;gt; 'client_credentials',
        'client_id'     =&amp;gt; config('services.auth.client_id'),
        'client_secret' =&amp;gt; config('services.auth.client_secret'),
        'scope'         =&amp;gt; 'read-products write-products',
    ]);

    $this-&amp;gt;accessToken = $response-&amp;gt;json('access_token');

    Cache::put(
        'service_access_token',
        $this-&amp;gt;accessToken,
        now()-&amp;gt;addMinutes(14) // Expire এর ১ মিনিট আগে
    );

    return $this-&amp;gt;accessToken;
}

public function syncProducts(): void
{
    $token = $this-&amp;gt;getToken();

    Http::withToken($token)
        -&amp;gt;post(config('services.inventory.url') . '/internal/sync', [
            'products' =&amp;gt; Product::all()-&amp;gt;toArray()
        ]);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Social Login — Google/Facebook দিয়ে Login:**

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
bash&lt;br&gt;
composer require laravel/socialite&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
shell&lt;br&gt;
php&lt;br&gt;
// config/services.php&lt;br&gt;
'google' =&amp;gt; [&lt;br&gt;
    'client_id'     =&amp;gt; env('GOOGLE_CLIENT_ID'),&lt;br&gt;
    'client_secret' =&amp;gt; env('GOOGLE_CLIENT_SECRET'),&lt;br&gt;
    'redirect'      =&amp;gt; env('GOOGLE_REDIRECT_URI'),&lt;br&gt;
],&lt;/p&gt;

&lt;p&gt;'facebook' =&amp;gt; [&lt;br&gt;
    'client_id'     =&amp;gt; env('FACEBOOK_APP_ID'),&lt;br&gt;
    'client_secret' =&amp;gt; env('FACEBOOK_APP_SECRET'),&lt;br&gt;
    'redirect'      =&amp;gt; env('FACEBOOK_REDIRECT_URI'),&lt;br&gt;
],&lt;/p&gt;

&lt;p&gt;// app/Http/Controllers/Auth/SocialAuthController.php&lt;br&gt;
class SocialAuthController extends Controller&lt;br&gt;
{&lt;br&gt;
    // ১. Google/Facebook এ Redirect করুন&lt;br&gt;
    public function redirect(string $provider): RedirectResponse&lt;br&gt;
    {&lt;br&gt;
        $validProviders = ['google', 'facebook', 'github'];&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    if (!in_array($provider, $validProviders)) {
        return response()-&amp;gt;json(['message' =&amp;gt; 'Invalid provider'], 400);
    }

    return Socialite::driver($provider)-&amp;gt;redirect();
}

// ২. Callback — Google/Facebook থেকে ফিরে আসলে
public function callback(string $provider): JsonResponse
{
    try {
        $socialUser = Socialite::driver($provider)-&amp;gt;user();

    } catch (\Exception $e) {
        return response()-&amp;gt;json([
            'message' =&amp;gt; 'Social Login ব্যর্থ হয়েছে।'
        ], 401);
    }

    // Email দিয়ে User খুঁজুন
    $user = User::where('email', $socialUser-&amp;gt;getEmail())-&amp;gt;first();

    if ($user) {
        // আগে Register করেছে → Social Account Link করুন
        $user-&amp;gt;socialAccounts()-&amp;gt;updateOrCreate(
            ['provider' =&amp;gt; $provider],
            [
                'provider_id'    =&amp;gt; $socialUser-&amp;gt;getId(),
                'provider_token' =&amp;gt; $socialUser-&amp;gt;token,
                'avatar'         =&amp;gt; $socialUser-&amp;gt;getAvatar(),
            ]
        );

    } else {
        // নতুন User → Register করুন
        $user = DB::transaction(function () use ($socialUser, $provider) {
            $newUser = User::create([
                'name'              =&amp;gt; $socialUser-&amp;gt;getName(),
                'email'             =&amp;gt; $socialUser-&amp;gt;getEmail(),
                'email_verified_at' =&amp;gt; now(), // Social Login = Email Verified
                'password'          =&amp;gt; bcrypt(Str::random(32)), // Random Password
                'avatar'            =&amp;gt; $socialUser-&amp;gt;getAvatar(),
            ]);

            $newUser-&amp;gt;socialAccounts()-&amp;gt;create([
                'provider'       =&amp;gt; $provider,
                'provider_id'    =&amp;gt; $socialUser-&amp;gt;getId(),
                'provider_token' =&amp;gt; $socialUser-&amp;gt;token,
            ]);

            return $newUser;
        });
    }

    // JWT Token Generate করুন
    $token = auth('api')-&amp;gt;login($user);

    return response()-&amp;gt;json([
        'access_token' =&amp;gt; $token,
        'token_type'   =&amp;gt; 'Bearer',
        'user'         =&amp;gt; new UserResource($user),
    ]);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
---

🟢 **PART 4 — Encryption (এনক্রিপশন)**

**Encryption এর ধরন:**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
Symmetric Encryption    →  একই Key দিয়ে Encrypt ও Decrypt&lt;br&gt;
                           AES-256 — দ্রুত, Bulk Data এর জন্য&lt;/p&gt;

&lt;p&gt;Asymmetric Encryption   →  Public Key দিয়ে Encrypt&lt;br&gt;
                           Private Key দিয়ে Decrypt&lt;br&gt;
                           RSA — ধীর, Key Exchange এর জন্য&lt;/p&gt;

&lt;p&gt;Hashing                 →  One-way, Decrypt করা যায় না&lt;br&gt;
                           bcrypt, argon2 — Password Storage এর জন্য&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Laravel-এ Encryption:**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
plaintext&lt;br&gt;
php&lt;br&gt;
// ১. Built-in Encryption — Sensitive Data&lt;br&gt;
class SensitiveDataService&lt;br&gt;
{&lt;br&gt;
    // Encrypt করুন — DB তে Store করার আগে&lt;br&gt;
    public function storeSensitiveData(array $data): UserProfile&lt;br&gt;
    {&lt;br&gt;
        return UserProfile::create([&lt;br&gt;
            'user_id'       =&amp;gt; auth()-&amp;gt;id(),&lt;br&gt;
            // Encrypt করে রাখুন&lt;br&gt;
            'national_id'   =&amp;gt; encrypt($data['national_id']),&lt;br&gt;
            'bank_account'  =&amp;gt; encrypt($data['bank_account']),&lt;br&gt;
            'phone'         =&amp;gt; encrypt($data['phone']),&lt;br&gt;
            // Normal Data&lt;br&gt;
            'name'          =&amp;gt; $data['name'],&lt;br&gt;
        ]);&lt;br&gt;
    }&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Decrypt করুন — ব্যবহারের সময়
public function getSensitiveData(int $userId): array
{
    $profile = UserProfile::where('user_id', $userId)-&amp;gt;firstOrFail();

    return [
        'name'         =&amp;gt; $profile-&amp;gt;name,
        'national_id'  =&amp;gt; decrypt($profile-&amp;gt;national_id),
        'bank_account' =&amp;gt; decrypt($profile-&amp;gt;bank_account),
        'phone'        =&amp;gt; decrypt($profile-&amp;gt;phone),
    ];
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;// ২. Model Casting — Automatic Encrypt/Decrypt&lt;br&gt;
class UserProfile extends Model&lt;br&gt;
{&lt;br&gt;
    protected $casts = [&lt;br&gt;
        // Laravel 9+ — Automatic Encrypt/Decrypt&lt;br&gt;
        'national_id'  =&amp;gt; 'encrypted',&lt;br&gt;
        'bank_account' =&amp;gt; 'encrypted',&lt;br&gt;
        'metadata'     =&amp;gt; 'encrypted:array', // Array ও Encrypt করা যায়&lt;br&gt;
    ];&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;// ব্যবহার — Automatic!&lt;br&gt;
$profile = UserProfile::create([&lt;br&gt;
    'national_id' =&amp;gt; '1234567890', // Automatically Encrypted&lt;br&gt;
]);&lt;/p&gt;

&lt;p&gt;echo $profile-&amp;gt;national_id; // Automatically Decrypted → 1234567890&lt;/p&gt;

&lt;p&gt;// ৩. Custom Encryption — AES-256&lt;br&gt;
class EncryptionService&lt;br&gt;
{&lt;br&gt;
    private string $key;&lt;br&gt;
    private string $cipher = 'AES-256-CBC';&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function __construct()
{
    $this-&amp;gt;key = base64_decode(config('app.encryption_key'));
}

public function encrypt(string $data): string
{
    $iv        = random_bytes(openssl_cipher_iv_length($this-&amp;gt;cipher));
    $encrypted = openssl_encrypt($data, $this-&amp;gt;cipher, $this-&amp;gt;key, 0, $iv);
    $hmac      = hash_hmac('sha256', $encrypted, $this-&amp;gt;key, true);

    // IV + HMAC + Encrypted Data একসাথে রাখুন
    return base64_encode($iv . $hmac . $encrypted);
}

public function decrypt(string $encryptedData): string
{
    $decoded   = base64_decode($encryptedData);
    $ivLength  = openssl_cipher_iv_length($this-&amp;gt;cipher);
    $iv        = substr($decoded, 0, $ivLength);
    $hmac      = substr($decoded, $ivLength, 32);
    $encrypted = substr($decoded, $ivLength + 32);

    // HMAC Verify করুন — Tamper Check
    $expectedHmac = hash_hmac('sha256', $encrypted, $this-&amp;gt;key, true);

    if (!hash_equals($expectedHmac, $hmac)) {
        throw new DecryptException('Data tampered! HMAC mismatch.');
    }

    return openssl_decrypt($encrypted, $this-&amp;gt;cipher, $this-&amp;gt;key, 0, $iv);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Password Hashing — সঠিকভাবে:**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
php&lt;br&gt;
// ১. Password Store করুন — bcrypt (Default)&lt;br&gt;
$user = User::create([&lt;br&gt;
    'password' =&amp;gt; Hash::make($request-&amp;gt;password), // bcrypt&lt;br&gt;
]);&lt;/p&gt;

&lt;p&gt;// অথবা Argon2 (আরো শক্তিশালী)&lt;br&gt;
$hash = Hash::driver('argon2id')-&amp;gt;make($request-&amp;gt;password);&lt;/p&gt;

&lt;p&gt;// ২. Password Verify করুন&lt;br&gt;
if (!Hash::check($request-&amp;gt;password, $user-&amp;gt;password)) {&lt;br&gt;
    throw new UnauthorizedException('Password ভুল।');&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;// ৩. Password Rehash — Algorithm Update হলে&lt;br&gt;
if (Hash::needsRehash($user-&amp;gt;password)) {&lt;br&gt;
    $user-&amp;gt;update([&lt;br&gt;
        'password' =&amp;gt; Hash::make($request-&amp;gt;password)&lt;br&gt;
    ]);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;// ❌ কখনো এভাবে করবেন না&lt;br&gt;
$user-&amp;gt;password = md5($password);      // MD5 — ভাঙা!&lt;br&gt;
$user-&amp;gt;password = sha1($password);     // SHA1 — ভাঙা!&lt;br&gt;
$user-&amp;gt;password = $password;           // Plain text — মারাত্মক!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
---

🛡️ **PART 5 — Authorization (Role &amp;amp; Permission)**
**Spatie Permission — Professional RBAC:**

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
bash&lt;br&gt;
composer require spatie/laravel-permission&lt;br&gt;
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"&lt;br&gt;
php artisan migrate&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
shell&lt;br&gt;
php&lt;br&gt;
// Roles ও Permissions তৈরি করুন&lt;br&gt;
class RolePermissionSeeder extends Seeder&lt;br&gt;
{&lt;br&gt;
    public function run(): void&lt;br&gt;
    {&lt;br&gt;
        // Permissions তৈরি করুন&lt;br&gt;
        $permissions = [&lt;br&gt;
            // Products&lt;br&gt;
            'products.view', 'products.create',&lt;br&gt;
            'products.edit', 'products.delete',&lt;br&gt;
            // Orders&lt;br&gt;
            'orders.view', 'orders.manage',&lt;br&gt;
            'orders.refund',&lt;br&gt;
            // Users&lt;br&gt;
            'users.view', 'users.create',&lt;br&gt;
            'users.edit', 'users.delete', 'users.ban',&lt;br&gt;
            // Settings&lt;br&gt;
            'settings.view', 'settings.manage',&lt;br&gt;
        ];&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    foreach ($permissions as $permission) {
        Permission::create(['name' =&amp;gt; $permission]);
    }

    // Roles তৈরি করুন এবং Permissions দিন
    $superAdmin = Role::create(['name' =&amp;gt; 'super-admin']);
    $superAdmin-&amp;gt;givePermissionTo(Permission::all()); // সব Permission

    $admin = Role::create(['name' =&amp;gt; 'admin']);
    $admin-&amp;gt;givePermissionTo([
        'products.view', 'products.create', 'products.edit',
        'orders.view', 'orders.manage',
        'users.view',
    ]);

    $seller = Role::create(['name' =&amp;gt; 'seller']);
    $seller-&amp;gt;givePermissionTo([
        'products.view', 'products.create', 'products.edit',
        'orders.view',
    ]);

    $customer = Role::create(['name' =&amp;gt; 'customer']);
    $customer-&amp;gt;givePermissionTo([
        'products.view',
        'orders.view',
    ]);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;// Policy — Object Level Permission&lt;br&gt;
class ProductPolicy&lt;br&gt;
{&lt;br&gt;
    // Product দেখার অনুমতি&lt;br&gt;
    public function view(User $user, Product $product): bool&lt;br&gt;
    {&lt;br&gt;
        return $user-&amp;gt;hasPermissionTo('products.view');&lt;br&gt;
    }&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Product Edit — নিজের বা Admin
public function update(User $user, Product $product): bool
{
    return $user-&amp;gt;id === $product-&amp;gt;user_id
        || $user-&amp;gt;hasRole(['admin', 'super-admin']);
}

// Product Delete — শুধু Admin
public function delete(User $user, Product $product): bool
{
    return $user-&amp;gt;hasRole(['admin', 'super-admin'])
        || ($user-&amp;gt;id === $product-&amp;gt;user_id
            &amp;amp;&amp;amp; $user-&amp;gt;hasPermissionTo('products.delete'));
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;// Controller এ ব্যবহার করুন&lt;br&gt;
class ProductController extends Controller&lt;br&gt;
{&lt;br&gt;
    public function update(UpdateProductRequest $request, Product $product)&lt;br&gt;
    {&lt;br&gt;
        // Policy Check — Permission নেই? Automatically 403&lt;br&gt;
        $this-&amp;gt;authorize('update', $product);&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    $product-&amp;gt;update($request-&amp;gt;validated());

    return new ProductResource($product);
}

public function destroy(Product $product)
{
    $this-&amp;gt;authorize('delete', $product);

    $product-&amp;gt;delete();

    return response()-&amp;gt;json(['message' =&amp;gt; 'Product deleted']);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;// Blade এ Permission Check&lt;br&gt;
&lt;a class="mentioned-user" href="https://dev.to/can"&gt;@can&lt;/a&gt;('products.create')&lt;br&gt;
    নতুন Product যোগ করুন&lt;br&gt;
@endcan&lt;/p&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/role"&gt;@role&lt;/a&gt;('admin|super-admin')&lt;br&gt;
    &lt;a href="/admin"&gt;Admin Panel&lt;/a&gt;&lt;br&gt;
@endrole&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
---

🔒 **PART 6 — Common Security Vulnerabilities**
**SQL Injection থেকে রক্ষা:**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
php&lt;br&gt;
// ❌ ভুল — SQL Injection এর সুযোগ!&lt;br&gt;
$products = DB::select(&lt;br&gt;
    "SELECT * FROM products WHERE name = '$request-&amp;gt;name'"&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;// ✅ সঠিক — Parameterized Query&lt;br&gt;
$products = DB::select(&lt;br&gt;
    'SELECT * FROM products WHERE name = ?',&lt;br&gt;
    [$request-&amp;gt;name]&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;// ✅ আরো ভালো — Eloquent ORM&lt;br&gt;
$products = Product::where('name', $request-&amp;gt;name)-&amp;gt;get();&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**XSS (Cross-Site Scripting) থেকে রক্ষা:**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
php&lt;br&gt;
// ❌ ভুল — XSS এর সুযোগ!&lt;br&gt;
return response("&lt;/p&gt;
&lt;p&gt;Hello {$request-&amp;gt;name}&lt;/p&gt;");

&lt;p&gt;// ✅ সঠিক — Escape করুন&lt;br&gt;
return response("&lt;/p&gt;
&lt;p&gt;Hello " . e($request-&amp;gt;name) . "&lt;/p&gt;");

&lt;p&gt;// ✅ Blade Template — Automatically Escape&lt;br&gt;
{{ $user-&amp;gt;name }}      // Safe — Escaped&lt;br&gt;
{!! $user-&amp;gt;bio !!}     // Unsafe — Raw HTML&lt;/p&gt;

&lt;p&gt;// Input Sanitize করুন&lt;br&gt;
class SanitizeInput&lt;br&gt;
{&lt;br&gt;
    public static function clean(string $input): string&lt;br&gt;
    {&lt;br&gt;
        // HTML Tags সরিয়ে দিন&lt;br&gt;
        $input = strip_tags($input);&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    // Special Characters Encode করুন
    $input = htmlspecialchars($input, ENT_QUOTES, 'UTF-8');

    // Extra Whitespace সরান
    return trim($input);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;// Content Security Policy Header&lt;br&gt;
class SecurityHeadersMiddleware&lt;br&gt;
{&lt;br&gt;
    public function handle(Request $request, Closure $next): Response&lt;br&gt;
    {&lt;br&gt;
        $response = $next($request);&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    $response-&amp;gt;headers-&amp;gt;set(
        'Content-Security-Policy',
        "default-src 'self'; " .
        "script-src 'self' 'nonce-" . csrf_token() . "'; " .
        "style-src 'self' https://fonts.googleapis.com; " .
        "img-src 'self' data: https:; " .
        "font-src 'self' https://fonts.gstatic.com;"
    );

    $response-&amp;gt;headers-&amp;gt;set('X-Content-Type-Options', 'nosniff');
    $response-&amp;gt;headers-&amp;gt;set('X-Frame-Options', 'DENY');
    $response-&amp;gt;headers-&amp;gt;set('X-XSS-Protection', '1; mode=block');
    $response-&amp;gt;headers-&amp;gt;set(
        'Strict-Transport-Security',
        'max-age=31536000; includeSubDomains'
    );

    return $response;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**CSRF Protection:**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
php&lt;br&gt;
// Laravel Automatically CSRF Protect করে Web Routes এ&lt;br&gt;
// API Routes এ Stateless Token ব্যবহার করুন&lt;/p&gt;

&lt;p&gt;// Exempt করুন — Webhook Routes&lt;br&gt;
// app/Http/Middleware/VerifyCsrfToken.php&lt;br&gt;
protected $except = [&lt;br&gt;
    'webhook/*',&lt;br&gt;
    'api/payment/callback',&lt;br&gt;
];&lt;/p&gt;

&lt;p&gt;// API এ Sanctum Token ব্যবহার করুন&lt;br&gt;
Route::middleware('auth:sanctum')-&amp;gt;group(function () {&lt;br&gt;
    Route::post('/products', [ProductController::class, 'store']);&lt;br&gt;
});&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Rate Limiting — Advanced:**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
php&lt;br&gt;
// app/Providers/AppServiceProvider.php&lt;br&gt;
public function boot(): void&lt;br&gt;
{&lt;br&gt;
    // API Rate Limit&lt;br&gt;
    RateLimiter::for('api', function (Request $request) {&lt;br&gt;
        return $request-&amp;gt;user()&lt;br&gt;
            ? Limit::perMinute(120)-&amp;gt;by($request-&amp;gt;user()-&amp;gt;id)&lt;br&gt;
            : Limit::perMinute(30)-&amp;gt;by($request-&amp;gt;ip());&lt;br&gt;
    });&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Login Rate Limit — Brute Force Protection
RateLimiter::for('login', function (Request $request) {
    return [
        Limit::perMinute(5)-&amp;gt;by($request-&amp;gt;input('email')),
        Limit::perMinute(10)-&amp;gt;by($request-&amp;gt;ip()),
    ];
});

// OTP Rate Limit
RateLimiter::for('otp', function (Request $request) {
    return Limit::perHour(3)-&amp;gt;by($request-&amp;gt;input('phone'));
});

// Expensive Operations
RateLimiter::for('reports', function (Request $request) {
    return Limit::perHour(5)
                -&amp;gt;by($request-&amp;gt;user()-&amp;gt;id)
                -&amp;gt;response(function () {
                    return response()-&amp;gt;json([
                        'message' =&amp;gt; 'প্রতি ঘন্টায় সর্বোচ্চ ৫টা Report Generate করা যাবে।'
                    ], 429);
                });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
---


🔏 **PART 7 — API Security Best Practices**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
php&lt;br&gt;
// app/Http/Middleware/ApiSecurityMiddleware.php&lt;br&gt;
class ApiSecurityMiddleware&lt;br&gt;
{&lt;br&gt;
    public function handle(Request $request, Closure $next): Response&lt;br&gt;
    {&lt;br&gt;
        // ১. HTTPS Check&lt;br&gt;
        if (!$request-&amp;gt;secure() &amp;amp;&amp;amp; config('app.env') === 'production') {&lt;br&gt;
            return response()-&amp;gt;json([&lt;br&gt;
                'message' =&amp;gt; 'HTTPS Required'&lt;br&gt;
            ], 403);&lt;br&gt;
        }&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    // ২. API Version Check
    $version = $request-&amp;gt;header('X-API-Version', '1');
    if (!in_array($version, ['1', '2'])) {
        return response()-&amp;gt;json([
            'message' =&amp;gt; 'Unsupported API Version'
        ], 400);
    }

    // ৩. Request Size Limit — Large Payload Attack থেকে রক্ষা
    $contentLength = $request-&amp;gt;header('Content-Length', 0);
    if ($contentLength &amp;gt; 10 * 1024 * 1024) { // ১০ MB
        return response()-&amp;gt;json([
            'message' =&amp;gt; 'Request Too Large'
        ], 413);
    }

    // ৪. Suspicious Pattern Detect করুন
    $body = $request-&amp;gt;getContent();
    if ($this-&amp;gt;hasSqlInjection($body) || $this-&amp;gt;hasXssPattern($body)) {
        Log::warning('Suspicious request detected', [
            'ip'  =&amp;gt; $request-&amp;gt;ip(),
            'url' =&amp;gt; $request-&amp;gt;fullUrl(),
        ]);

        return response()-&amp;gt;json([
            'message' =&amp;gt; 'Invalid Request'
        ], 400);
    }

    $response = $next($request);

    // ৫. Sensitive Data Response Header সরিয়ে দিন
    $response-&amp;gt;headers-&amp;gt;remove('X-Powered-By');
    $response-&amp;gt;headers-&amp;gt;remove('Server');
    $response-&amp;gt;headers-&amp;gt;set('X-Request-ID', Str::uuid());

    return $response;
}

private function hasSqlInjection(string $input): bool
{
    $patterns = [
        '/(\bunion\b.*\bselect\b)/i',
        '/(\bselect\b.*\bfrom\b)/i',
        '/(\bdrop\b.*\btable\b)/i',
        '/(\bdelete\b.*\bfrom\b)/i',
        "/(--|\#|\/\*)/",
    ];

    foreach ($patterns as $pattern) {
        if (preg_match($pattern, $input)) {
            return true;
        }
    }

    return false;
}

private function hasXssPattern(string $input): bool
{
    $patterns = [
        '/&amp;lt;script\b[^&amp;gt;]*&amp;gt;/i',
        '/javascript:/i',
        '/on\w+\s*=/i',
    ];

    foreach ($patterns as $pattern) {
        if (preg_match($pattern, $input)) {
            return true;
        }
    }

    return false;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;// Sensitive Data Masking — Log এ Sensitive Data রাখবেন না&lt;br&gt;
class MaskSensitiveData&lt;br&gt;
{&lt;br&gt;
    private array $sensitiveFields = [&lt;br&gt;
        'password', 'password_confirmation',&lt;br&gt;
        'credit_card', 'card_number', 'cvv',&lt;br&gt;
        'national_id', 'bank_account',&lt;br&gt;
        'token', 'secret', 'api_key',&lt;br&gt;
    ];&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function mask(array $data): array
{
    foreach ($data as $key =&amp;gt; $value) {
        if (in_array(strtolower($key), $this-&amp;gt;sensitiveFields)) {
            $data[$key] = '***MASKED***';
        } elseif (is_array($value)) {
            $data[$key] = $this-&amp;gt;mask($value);
        }
    }

    return $data;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
---


🏗️ **PART 8 — Two Factor Authentication (2FA)**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
php&lt;br&gt;
// app/Services/TwoFactorService.php&lt;br&gt;
class TwoFactorService&lt;br&gt;
{&lt;br&gt;
    // ১. 2FA Enable করুন&lt;br&gt;
    public function enable(User $user): array&lt;br&gt;
    {&lt;br&gt;
        // Secret Key Generate করুন&lt;br&gt;
        $secret = Google2FA::generateSecretKey();&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    // Backup Codes Generate করুন
    $backupCodes = collect(range(1, 8))
                        -&amp;gt;map(fn() =&amp;gt; Str::random(10))
                        -&amp;gt;toArray();

    // DB তে রাখুন (Encrypted)
    $user-&amp;gt;update([
        'two_factor_secret'  =&amp;gt; encrypt($secret),
        'two_factor_backup'  =&amp;gt; encrypt(json_encode(
            array_map('bcrypt', $backupCodes)
        )),
        'two_factor_enabled' =&amp;gt; false, // Confirm না হওয়া পর্যন্ত
    ]);

    // QR Code URL Generate করুন
    $qrCodeUrl = Google2FA::getQRCodeUrl(
        config('app.name'),
        $user-&amp;gt;email,
        $secret
    );

    return [
        'secret'       =&amp;gt; $secret,
        'qr_code_url'  =&amp;gt; $qrCodeUrl,
        'backup_codes' =&amp;gt; $backupCodes,
    ];
}

// ২. OTP Verify করুন
public function verify(User $user, string $otp): bool
{
    $secret = decrypt($user-&amp;gt;two_factor_secret);

    // Google Authenticator OTP Check
    $valid = Google2FA::verifyKey($secret, $otp, 1); // 1 = 30 sec window

    if (!$valid) {
        // Backup Code Check
        $valid = $this-&amp;gt;verifyBackupCode($user, $otp);
    }

    if ($valid &amp;amp;&amp;amp; !$user-&amp;gt;two_factor_enabled) {
        $user-&amp;gt;update(['two_factor_enabled' =&amp;gt; true]);
    }

    return $valid;
}

// ৩. Login এ 2FA Check
public function challengeCheck(Request $request): JsonResponse
{
    $user = auth('api')-&amp;gt;user();

    if (!$user-&amp;gt;two_factor_enabled) {
        return response()-&amp;gt;json(['requires_2fa' =&amp;gt; false]);
    }

    // 2FA Token পাঠান Session এ রাখুন
    $challengeToken = Str::random(32);
    Cache::put(
        "2fa_challenge:{$challengeToken}",
        $user-&amp;gt;id,
        now()-&amp;gt;addMinutes(5)
    );

    // Current Token Invalidate করুন
    auth('api')-&amp;gt;logout();

    return response()-&amp;gt;json([
        'requires_2fa'    =&amp;gt; true,
        'challenge_token' =&amp;gt; $challengeToken,
        'message'         =&amp;gt; 'Google Authenticator থেকে OTP দিন।',
    ]);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
---


📝 **সংক্ষেপে মনে রাখুন**
**JWT** — Stateless Authentication, Self-contained Token, Microservices এর জন্য আদর্শ। Access Token ছোট (১৫ মিনিট), Refresh Token বড় (৩০ দিন) রাখুন।
**OAuth2** — Third-party Login (Google, Facebook) এবং Machine-to-Machine Auth এর জন্য। Laravel Passport দিয়ে সহজে করা যায়।
**Encryption** — Sensitive Data (NID, Bank Account) সবসময় Encrypt করে রাখুন। Password সবসময় bcrypt/argon2 দিয়ে Hash করুন, কখনো Plain text না।
**Security Best Practices** — SQL Injection (Eloquent ORM), XSS (Escape), CSRF (Token), Rate Limiting, HTTPS — এই সবগুলো একসাথে মেনে চলুন।

**_Q:7_** - **DevOps (CI/CD, Docker, Kubernetes)**
**Answer**: 

🚀 **DevOps কী?**

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
আগে (Traditional):&lt;br&gt;
Developer → Code লিখলো → IT Team কে দিলো → ২ সপ্তাহ পরে Deploy!&lt;br&gt;
                                              ↑ ধীর, Error প্রবণ&lt;/p&gt;

&lt;p&gt;DevOps (এখন):&lt;br&gt;
Developer → Code Push → Auto Test → Auto Build → Auto Deploy&lt;br&gt;
                                                   ↑ মিনিটের মধ্যে!&lt;/p&gt;

&lt;p&gt;DevOps = Development + Operations&lt;br&gt;
লক্ষ্য: দ্রুত, নিরাপদ, বারবার Software Deliver করা&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
---

🐳 **PART 1 — Docker**
**Docker কী?**
Docker হলো **Container** Technology। আপনার অ্যাপ এবং তার সব Dependencies একটা **Box (Container)** এ রেখে দেওয়া — যেকোনো Server এ একই ভাবে চলবে।

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
সমস্যা (Docker ছাড়া):&lt;br&gt;
"আমার Machine এ কাজ করে কিন্তু&lt;br&gt;
 Server এ করে না!" ← সবচেয়ে বিখ্যাত সমস্যা 😅&lt;/p&gt;

&lt;p&gt;সমাধান (Docker সহ):&lt;br&gt;
Container এ সব আছে:&lt;br&gt;
├── PHP 8.3&lt;br&gt;
├── Laravel App&lt;br&gt;
├── Composer Dependencies&lt;br&gt;
├── Nginx Config&lt;br&gt;
└── Environment Variables&lt;br&gt;
→ যেকোনো জায়গায় একই রেজাল্ট!&lt;/p&gt;

&lt;p&gt;VM vs Container:&lt;br&gt;
┌─────────────────────┐  ┌─────────────────────┐&lt;br&gt;
│  Virtual Machine     │  │  Docker Container    │&lt;br&gt;
├─────────────────────┤  ├─────────────────────┤&lt;br&gt;
│  Full OS (2-4 GB)   │  │  App + Libs (50 MB)  │&lt;br&gt;
│  Slow Start (মিনিট) │  │  Fast Start (সেকেন্ড)│&lt;br&gt;
│  Heavy              │  │  Lightweight          │&lt;br&gt;
└─────────────────────┘  └─────────────────────┘&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Laravel Project এর জন্য Dockerfile:**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
plaintext&lt;br&gt;
dockerfile# Dockerfile&lt;/p&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────────
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Stage 1: Dependencies Install
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────────
&lt;/h1&gt;

&lt;p&gt;FROM php:8.3-fpm-alpine AS dependencies&lt;/p&gt;
&lt;h1&gt;
  
  
  System Dependencies Install করুন
&lt;/h1&gt;

&lt;p&gt;RUN apk add --no-cache \&lt;br&gt;
    git \&lt;br&gt;
    curl \&lt;br&gt;
    libpng-dev \&lt;br&gt;
    libxml2-dev \&lt;br&gt;
    zip \&lt;br&gt;
    unzip \&lt;br&gt;
    nodejs \&lt;br&gt;
    npm&lt;/p&gt;
&lt;h1&gt;
  
  
  PHP Extensions Install করুন
&lt;/h1&gt;

&lt;p&gt;RUN docker-php-ext-install \&lt;br&gt;
    pdo \&lt;br&gt;
    pdo_mysql \&lt;br&gt;
    mbstring \&lt;br&gt;
    exif \&lt;br&gt;
    pcntl \&lt;br&gt;
    bcmath \&lt;br&gt;
    gd \&lt;br&gt;
    opcache&lt;/p&gt;
&lt;h1&gt;
  
  
  Redis Extension
&lt;/h1&gt;

&lt;p&gt;RUN pecl install redis &amp;amp;&amp;amp; docker-php-ext-enable redis&lt;/p&gt;
&lt;h1&gt;
  
  
  Composer Install করুন
&lt;/h1&gt;

&lt;p&gt;COPY --from=composer:latest /usr/bin/composer /usr/bin/composer&lt;/p&gt;
&lt;h1&gt;
  
  
  Working Directory Set করুন
&lt;/h1&gt;

&lt;p&gt;WORKDIR /var/www/html&lt;/p&gt;
&lt;h1&gt;
  
  
  Dependencies Install করুন (Code আগে না)
&lt;/h1&gt;
&lt;h1&gt;
  
  
  এতে Docker Cache কাজ করে — দ্রুত Build
&lt;/h1&gt;

&lt;p&gt;COPY composer.json composer.lock ./&lt;br&gt;
RUN composer install \&lt;br&gt;
    --no-dev \&lt;br&gt;
    --no-interaction \&lt;br&gt;
    --prefer-dist \&lt;br&gt;
    --optimize-autoloader&lt;/p&gt;
&lt;h1&gt;
  
  
  NPM Dependencies
&lt;/h1&gt;

&lt;p&gt;COPY package.json package-lock.json ./&lt;br&gt;
RUN npm ci&lt;/p&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────────
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Stage 2: Production Image
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────────
&lt;/h1&gt;

&lt;p&gt;FROM php:8.3-fpm-alpine AS production&lt;/p&gt;

&lt;p&gt;WORKDIR /var/www/html&lt;/p&gt;
&lt;h1&gt;
  
  
  Dependencies Stage থেকে নিন
&lt;/h1&gt;

&lt;p&gt;COPY --from=dependencies /var/www/html/vendor ./vendor&lt;br&gt;
COPY --from=dependencies /usr/local/lib/php /usr/local/lib/php&lt;/p&gt;
&lt;h1&gt;
  
  
  Application Code Copy করুন
&lt;/h1&gt;

&lt;p&gt;COPY . .&lt;/p&gt;
&lt;h1&gt;
  
  
  Assets Build করুন
&lt;/h1&gt;

&lt;p&gt;RUN npm run build &amp;amp;&amp;amp; rm -rf node_modules&lt;/p&gt;
&lt;h1&gt;
  
  
  Laravel Optimization
&lt;/h1&gt;

&lt;p&gt;RUN php artisan config:cache &amp;amp;&amp;amp; \&lt;br&gt;
    php artisan route:cache &amp;amp;&amp;amp; \&lt;br&gt;
    php artisan view:cache &amp;amp;&amp;amp; \&lt;br&gt;
    php artisan event:cache&lt;/p&gt;
&lt;h1&gt;
  
  
  Permissions Set করুন
&lt;/h1&gt;

&lt;p&gt;RUN chown -R www-data:www-data /var/www/html/storage \&lt;br&gt;
    /var/www/html/bootstrap/cache&lt;/p&gt;
&lt;h1&gt;
  
  
  Non-root User হিসেবে চালান — Security
&lt;/h1&gt;

&lt;p&gt;USER www-data&lt;/p&gt;
&lt;h1&gt;
  
  
  Health Check
&lt;/h1&gt;

&lt;p&gt;HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \&lt;br&gt;
    CMD php-fpm -t || exit 1&lt;/p&gt;

&lt;p&gt;EXPOSE 9000&lt;/p&gt;

&lt;p&gt;CMD ["php-fpm"]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Docker Compose — Local Development:**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
plaintext&lt;br&gt;
yaml&lt;/p&gt;
&lt;h1&gt;
  
  
  docker-compose.yml
&lt;/h1&gt;

&lt;p&gt;version: '3.8'&lt;/p&gt;

&lt;p&gt;services:&lt;br&gt;
  # ─────────────────────────&lt;br&gt;
  # Laravel Application&lt;br&gt;
  # ─────────────────────────&lt;br&gt;
  app:&lt;br&gt;
    build:&lt;br&gt;
      context: .&lt;br&gt;
      dockerfile: Dockerfile&lt;br&gt;
      target: dependencies  # Development এ dependencies stage&lt;br&gt;
    container_name: laravel_app&lt;br&gt;
    restart: unless-stopped&lt;br&gt;
    working_dir: /var/www/html&lt;br&gt;
    volumes:&lt;br&gt;
      - .:/var/www/html              # Code Mount — Hot Reload&lt;br&gt;
      - ./storage:/var/www/html/storage&lt;br&gt;
    environment:&lt;br&gt;
      - APP_ENV=local&lt;br&gt;
      - APP_DEBUG=true&lt;br&gt;
      - DB_HOST=mysql&lt;br&gt;
      - REDIS_HOST=redis&lt;br&gt;
      - QUEUE_CONNECTION=redis&lt;br&gt;
    depends_on:&lt;br&gt;
      mysql:&lt;br&gt;
        condition: service_healthy&lt;br&gt;
      redis:&lt;br&gt;
        condition: service_healthy&lt;br&gt;
    networks:&lt;br&gt;
      - laravel_network&lt;/p&gt;

&lt;p&gt;# ─────────────────────────&lt;br&gt;
  # Nginx Web Server&lt;br&gt;
  # ─────────────────────────&lt;br&gt;
  nginx:&lt;br&gt;
    image: nginx:alpine&lt;br&gt;
    container_name: laravel_nginx&lt;br&gt;
    restart: unless-stopped&lt;br&gt;
    ports:&lt;br&gt;
      - "80:80"&lt;br&gt;
      - "443:443"&lt;br&gt;
    volumes:&lt;br&gt;
      - .:/var/www/html&lt;br&gt;
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf&lt;br&gt;
      - ./docker/nginx/ssl:/etc/nginx/ssl  # SSL Certificates&lt;br&gt;
    depends_on:&lt;br&gt;
      - app&lt;br&gt;
    networks:&lt;br&gt;
      - laravel_network&lt;/p&gt;

&lt;p&gt;# ─────────────────────────&lt;br&gt;
  # MySQL Database&lt;br&gt;
  # ─────────────────────────&lt;br&gt;
  mysql:&lt;br&gt;
    image: mysql:8.0&lt;br&gt;
    container_name: laravel_mysql&lt;br&gt;
    restart: unless-stopped&lt;br&gt;
    environment:&lt;br&gt;
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}&lt;br&gt;
      MYSQL_DATABASE: ${DB_DATABASE}&lt;br&gt;
      MYSQL_USER: ${DB_USERNAME}&lt;br&gt;
      MYSQL_PASSWORD: ${DB_PASSWORD}&lt;br&gt;
    volumes:&lt;br&gt;
      - mysql_data:/var/lib/mysql         # Data Persist&lt;br&gt;
      - ./docker/mysql/init.sql:/docker-entrypoint-initdb.d/init.sql&lt;br&gt;
    ports:&lt;br&gt;
      - "3306:3306"&lt;br&gt;
    healthcheck:&lt;br&gt;
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]&lt;br&gt;
      timeout: 20s&lt;br&gt;
      retries: 10&lt;br&gt;
    networks:&lt;br&gt;
      - laravel_network&lt;/p&gt;

&lt;p&gt;# ─────────────────────────&lt;br&gt;
  # Redis Cache&lt;br&gt;
  # ─────────────────────────&lt;br&gt;
  redis:&lt;br&gt;
    image: redis:7-alpine&lt;br&gt;
    container_name: laravel_redis&lt;br&gt;
    restart: unless-stopped&lt;br&gt;
    command: redis-server --requirepass ${REDIS_PASSWORD}&lt;br&gt;
    volumes:&lt;br&gt;
      - redis_data:/data&lt;br&gt;
    ports:&lt;br&gt;
      - "6379:6379"&lt;br&gt;
    healthcheck:&lt;br&gt;
      test: ["CMD", "redis-cli", "ping"]&lt;br&gt;
      interval: 10s&lt;br&gt;
      timeout: 5s&lt;br&gt;
      retries: 5&lt;br&gt;
    networks:&lt;br&gt;
      - laravel_network&lt;/p&gt;

&lt;p&gt;# ─────────────────────────&lt;br&gt;
  # Queue Worker&lt;br&gt;
  # ─────────────────────────&lt;br&gt;
  queue:&lt;br&gt;
    build:&lt;br&gt;
      context: .&lt;br&gt;
      dockerfile: Dockerfile&lt;br&gt;
      target: dependencies&lt;br&gt;
    container_name: laravel_queue&lt;br&gt;
    restart: unless-stopped&lt;br&gt;
    command: php artisan queue:work redis \&lt;br&gt;
             --sleep=3 \&lt;br&gt;
             --tries=3 \&lt;br&gt;
             --timeout=90 \&lt;br&gt;
             --queue=high-priority,default,low-priority&lt;br&gt;
    volumes:&lt;br&gt;
      - .:/var/www/html&lt;br&gt;
    depends_on:&lt;br&gt;
      - app&lt;br&gt;
      - redis&lt;br&gt;
    networks:&lt;br&gt;
      - laravel_network&lt;/p&gt;

&lt;p&gt;# ─────────────────────────&lt;br&gt;
  # Laravel Scheduler&lt;br&gt;
  # ─────────────────────────&lt;br&gt;
  scheduler:&lt;br&gt;
    build:&lt;br&gt;
      context: .&lt;br&gt;
      dockerfile: Dockerfile&lt;br&gt;
      target: dependencies&lt;br&gt;
    container_name: laravel_scheduler&lt;br&gt;
    restart: unless-stopped&lt;br&gt;
    command: &amp;gt;&lt;br&gt;
      sh -c "while true; do&lt;br&gt;
        php artisan schedule:run --verbose --no-interaction &amp;amp;&lt;br&gt;
        sleep 60&lt;br&gt;
      done"&lt;br&gt;
    volumes:&lt;br&gt;
      - .:/var/www/html&lt;br&gt;
    depends_on:&lt;br&gt;
      - app&lt;br&gt;
      - mysql&lt;br&gt;
    networks:&lt;br&gt;
      - laravel_network&lt;/p&gt;

&lt;p&gt;# ─────────────────────────&lt;br&gt;
  # phpMyAdmin (Development)&lt;br&gt;
  # ─────────────────────────&lt;br&gt;
  phpmyadmin:&lt;br&gt;
    image: phpmyadmin/phpmyadmin&lt;br&gt;
    container_name: laravel_phpmyadmin&lt;br&gt;
    environment:&lt;br&gt;
      PMA_HOST: mysql&lt;br&gt;
      PMA_PORT: 3306&lt;br&gt;
    ports:&lt;br&gt;
      - "8080:80"&lt;br&gt;
    profiles:&lt;br&gt;
      - dev  # শুধু Development এ&lt;br&gt;
    networks:&lt;br&gt;
      - laravel_network&lt;/p&gt;
&lt;h1&gt;
  
  
  ─────────────────────────
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Networks &amp;amp; Volumes
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ─────────────────────────
&lt;/h1&gt;

&lt;p&gt;networks:&lt;br&gt;
  laravel_network:&lt;br&gt;
    driver: bridge&lt;/p&gt;

&lt;p&gt;volumes:&lt;br&gt;
  mysql_data:&lt;br&gt;
    driver: local&lt;br&gt;
  redis_data:&lt;br&gt;
    driver: local&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Nginx Config:**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
docker&lt;br&gt;
nginx&lt;/p&gt;
&lt;h1&gt;
  
  
  docker/nginx/default.conf
&lt;/h1&gt;

&lt;p&gt;server {&lt;br&gt;
    listen 80;&lt;br&gt;
    listen [::]:80;&lt;br&gt;
    server_name myapp.com &lt;a href="http://www.myapp.com" rel="noopener noreferrer"&gt;www.myapp.com&lt;/a&gt;;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# HTTP → HTTPS Redirect
return 301 https://$server_name$request_uri;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;server {&lt;br&gt;
    listen 443 ssl http2;&lt;br&gt;
    server_name myapp.com &lt;a href="http://www.myapp.com" rel="noopener noreferrer"&gt;www.myapp.com&lt;/a&gt;;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# SSL Configuration
ssl_certificate     /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
ssl_protocols       TLSv1.2 TLSv1.3;
ssl_ciphers         HIGH:!aNULL:!MD5;

root /var/www/html/public;
index index.php;

# Gzip Compression
gzip on;
gzip_types text/plain text/css application/json application/javascript;
gzip_min_length 1000;

# Security Headers
add_header X-Frame-Options "DENY";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy "strict-origin-when-cross-origin";

# Static Files Cache
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
    expires 30d;
    add_header Cache-Control "public, immutable";
}

# PHP Files
location / {
    try_files $uri $uri/ /index.php?$query_string;
}

location ~ \.php$ {
    fastcgi_pass app:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
    include fastcgi_params;

    # Timeout Settings
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
}

# Sensitive Files Hide করুন
location ~ /\.(env|git|htaccess) {
    deny all;
}

# Max Upload Size
client_max_body_size 20M;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
---

🔄 **PART 2 — CI/CD Pipeline**

**CI/CD কী?**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
yaml&lt;br&gt;
CI = Continuous Integration&lt;br&gt;
     → Code Push করলেই Auto Test চলবে&lt;/p&gt;

&lt;p&gt;CD = Continuous Delivery/Deployment&lt;br&gt;
     → Test Pass হলে Auto Deploy হবে&lt;/p&gt;

&lt;p&gt;পুরো Flow:&lt;br&gt;
Developer → Git Push → CI Server&lt;br&gt;
                           ↓&lt;br&gt;
                    [Code Checkout]&lt;br&gt;
                           ↓&lt;br&gt;
                    [Dependencies Install]&lt;br&gt;
                           ↓&lt;br&gt;
                    [Code Quality Check]&lt;br&gt;
                           ↓&lt;br&gt;
                    [Unit Tests Run]&lt;br&gt;
                           ↓&lt;br&gt;
                    [Integration Tests]&lt;br&gt;
                           ↓&lt;br&gt;
                    [Docker Image Build]&lt;br&gt;
                           ↓&lt;br&gt;
                    [Push to Registry]&lt;br&gt;
                           ↓&lt;br&gt;
                    [Deploy to Staging]&lt;br&gt;
                           ↓&lt;br&gt;
                    [Smoke Tests]&lt;br&gt;
                           ↓&lt;br&gt;
                    [Deploy to Production] ✅&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**GitHub Actions — CI/CD Pipeline:**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
nginx&lt;br&gt;
yaml&lt;/p&gt;
&lt;h1&gt;
  
  
  .github/workflows/ci-cd.yml
&lt;/h1&gt;

&lt;p&gt;name: Laravel CI/CD Pipeline&lt;/p&gt;

&lt;p&gt;on:&lt;br&gt;
  push:&lt;br&gt;
    branches: [main, develop]&lt;br&gt;
  pull_request:&lt;br&gt;
    branches: [main]&lt;/p&gt;

&lt;p&gt;env:&lt;br&gt;
  PHP_VERSION: '8.3'&lt;br&gt;
  NODE_VERSION: '20'&lt;br&gt;
  DOCKER_IMAGE: ghcr.io/${{ github.repository }}&lt;/p&gt;

&lt;p&gt;jobs:&lt;br&gt;
  # ─────────────────────────────────&lt;br&gt;
  # Job 1: Code Quality Check&lt;br&gt;
  # ─────────────────────────────────&lt;br&gt;
  code-quality:&lt;br&gt;
    name: 🔍 Code Quality&lt;br&gt;
    runs-on: ubuntu-latest&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;steps:
  - name: Checkout Code
    uses: actions/checkout@v4

  - name: Setup PHP
    uses: shivammathur/setup-php@v2
    with:
      php-version: ${{ env.PHP_VERSION }}
      extensions: mbstring, pdo, redis
      coverage: xdebug

  - name: Cache Composer
    uses: actions/cache@v3
    with:
      path: vendor
      key: composer-${{ hashFiles('composer.lock') }}

  - name: Install Dependencies
    run: composer install --no-interaction --prefer-dist

  - name: PHP Code Style Check (Pint)
    run: ./vendor/bin/pint --test

  - name: Static Analysis (PHPStan)
    run: ./vendor/bin/phpstan analyse --level=8

  - name: Security Check
    run: composer audit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;# ─────────────────────────────────&lt;br&gt;
  # Job 2: Tests&lt;br&gt;
  # ─────────────────────────────────&lt;br&gt;
  tests:&lt;br&gt;
    name: 🧪 Run Tests&lt;br&gt;
    runs-on: ubuntu-latest&lt;br&gt;
    needs: code-quality&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services:
  mysql:
    image: mysql:8.0
    env:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: testing
    options: &amp;gt;-
      --health-cmd="mysqladmin ping"
      --health-interval=10s
      --health-timeout=5s
      --health-retries=3

  redis:
    image: redis:7-alpine
    options: &amp;gt;-
      --health-cmd="redis-cli ping"
      --health-interval=10s

steps:
  - uses: actions/checkout@v4

  - name: Setup PHP
    uses: shivammathur/setup-php@v2
    with:
      php-version: ${{ env.PHP_VERSION }}
      extensions: mbstring, pdo_mysql, redis
      coverage: xdebug

  - name: Install Dependencies
    run: composer install --no-interaction

  - name: Copy .env
    run: |
      cp .env.testing.example .env.testing
      php artisan key:generate --env=testing

  - name: Run Migrations
    run: php artisan migrate --env=testing --force
    env:
      DB_CONNECTION: mysql
      DB_HOST: 127.0.0.1
      DB_DATABASE: testing
      DB_USERNAME: root
      DB_PASSWORD: secret

  - name: Run Unit Tests
    run: |
      php artisan test \
        --parallel \
        --coverage-clover=coverage.xml \
        --min=80
    env:
      DB_CONNECTION: mysql
      DB_HOST: 127.0.0.1
      DB_DATABASE: testing
      DB_USERNAME: root
      DB_PASSWORD: secret
      REDIS_HOST: 127.0.0.1

  - name: Upload Coverage
    uses: codecov/codecov-action@v3
    with:
      file: ./coverage.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;# ─────────────────────────────────&lt;br&gt;
  # Job 3: Build Docker Image&lt;br&gt;
  # ─────────────────────────────────&lt;br&gt;
  build:&lt;br&gt;
    name: 🐳 Build &amp;amp; Push Docker Image&lt;br&gt;
    runs-on: ubuntu-latest&lt;br&gt;
    needs: tests&lt;br&gt;
    if: github.ref == 'refs/heads/main'&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;steps:
  - uses: actions/checkout@v4

  - name: Set up Docker Buildx
    uses: docker/setup-buildx-action@v3

  - name: Login to GitHub Container Registry
    uses: docker/login-action@v3
    with:
      registry: ghcr.io
      username: ${{ github.actor }}
      password: ${{ secrets.GITHUB_TOKEN }}

  - name: Extract Metadata
    id: meta
    uses: docker/metadata-action@v5
    with:
      images: ${{ env.DOCKER_IMAGE }}
      tags: |
        type=ref,event=branch
        type=semver,pattern={{version}}
        type=sha,prefix=sha-

  - name: Build &amp;amp; Push
    uses: docker/build-push-action@v5
    with:
      context: .
      push: true
      tags: ${{ steps.meta.outputs.tags }}
      labels: ${{ steps.meta.outputs.labels }}
      target: production
      cache-from: type=gha
      cache-to: type=gha,mode=max
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;# ─────────────────────────────────&lt;br&gt;
  # Job 4: Deploy to Staging&lt;br&gt;
  # ─────────────────────────────────&lt;br&gt;
  deploy-staging:&lt;br&gt;
    name: 🚀 Deploy to Staging&lt;br&gt;
    runs-on: ubuntu-latest&lt;br&gt;
    needs: build&lt;br&gt;
    environment: staging&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;steps:
  - name: Deploy to Staging Server
    uses: appleboy/ssh-action@v1
    with:
      host: ${{ secrets.STAGING_HOST }}
      username: ${{ secrets.STAGING_USER }}
      key: ${{ secrets.STAGING_SSH_KEY }}
      script: |
        cd /var/www/staging
        # নতুন Image Pull করুন
        docker pull ${{ env.DOCKER_IMAGE }}:main

        # Zero-downtime Deploy
        docker-compose up -d --no-deps app
        docker-compose exec -T app php artisan migrate --force
        docker-compose exec -T app php artisan config:cache
        docker-compose exec -T app php artisan route:cache

        # Health Check
        sleep 10
        curl -f http://localhost/health || exit 1

        echo "✅ Staging Deploy সফল!"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;# ─────────────────────────────────&lt;br&gt;
  # Job 5: Deploy to Production&lt;br&gt;
  # ─────────────────────────────────&lt;br&gt;
  deploy-production:&lt;br&gt;
    name: 🌟 Deploy to Production&lt;br&gt;
    runs-on: ubuntu-latest&lt;br&gt;
    needs: deploy-staging&lt;br&gt;
    environment: production  # Manual Approval লাগবে!&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;steps:
  - name: Blue-Green Deploy to Production
    uses: appleboy/ssh-action@v1
    with:
      host: ${{ secrets.PROD_HOST }}
      username: ${{ secrets.PROD_USER }}
      key: ${{ secrets.PROD_SSH_KEY }}
      script: |
        cd /var/www/production

        # Current Version Backup
        CURRENT=$(docker-compose ps -q app)

        # নতুন Container চালু করুন (Blue-Green)
        docker pull ${{ env.DOCKER_IMAGE }}:main
        docker-compose up -d --no-deps --scale app=2 app

        # Health Check
        sleep 15
        NEW_CONTAINER=$(docker-compose ps -q app | tail -1)
        docker exec $NEW_CONTAINER curl -f http://localhost/health

        # Migration Run করুন
        docker-compose exec -T app php artisan migrate --force

        # Cache Clear
        docker-compose exec -T app php artisan optimize

        # পুরনো Container সরিয়ে দিন
        docker-compose up -d --no-deps --scale app=1 app

        echo "✅ Production Deploy সফল!"

  - name: Notify Slack
    uses: 8398a7/action-slack@v3
    with:
      status: ${{ job.status }}
      text: |
        Production Deploy ${{ job.status }}!
        Commit: ${{ github.sha }}
        By: ${{ github.actor }}
    env:
      SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}
    if: always()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Test Classes — Laravel:**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;br&gt;
plaintext&lt;br&gt;
php&lt;br&gt;
// tests/Feature/Api/ProductTest.php&lt;br&gt;
class ProductApiTest extends TestCase&lt;br&gt;
{&lt;br&gt;
    use RefreshDatabase, WithFaker;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private User $user;
private string $token;

protected function setUp(): void
{
    parent::setUp();

    // Test User তৈরি করুন
    $this-&amp;gt;user  = User::factory()-&amp;gt;create();
    $this-&amp;gt;token = JWTAuth::fromUser($this-&amp;gt;user);
}

/** @test */
public function it_can_list_products(): void
{
    Product::factory()-&amp;gt;count(15)-&amp;gt;create();

    $response = $this-&amp;gt;withToken($this-&amp;gt;token)
                     -&amp;gt;getJson('/api/v1/products');

    $response-&amp;gt;assertOk()
             -&amp;gt;assertJsonStructure([
                 'data' =&amp;gt; [
                     '*' =&amp;gt; ['id', 'name', 'price', 'stock']
                 ],
                 'meta' =&amp;gt; ['total', 'current_page']
             ])
             -&amp;gt;assertJsonCount(15, 'data');
}

/** @test */
public function it_can_create_product(): void
{
    $category = Category::factory()-&amp;gt;create();

    $productData = [
        'name'        =&amp;gt; 'Test Product',
        'price'       =&amp;gt; 999.99,
        'stock'       =&amp;gt; 50,
        'category_id' =&amp;gt; $category-&amp;gt;id,
    ];

    $response = $this-&amp;gt;withToken($this-&amp;gt;token)
                     -&amp;gt;postJson('/api/v1/products', $productData);

    $response-&amp;gt;assertCreated()
             -&amp;gt;assertJsonFragment(['name' =&amp;gt; 'Test Product']);

    $this-&amp;gt;assertDatabaseHas('products', [
        'name'  =&amp;gt; 'Test Product',
        'price' =&amp;gt; 999.99,
    ]);
}

/** @test */
public function it_validates_required_fields(): void
{
    $response = $this-&amp;gt;withToken($this-&amp;gt;token)
                     -&amp;gt;postJson('/api/v1/products', []);

    $response-&amp;gt;assertUnprocessable()
             -&amp;gt;assertJsonValidationErrors(['name', 'price', 'stock']);
}

/** @test */
public function it_returns_404_for_nonexistent_product(): void
{
    $response = $this-&amp;gt;withToken($this-&amp;gt;token)
                     -&amp;gt;getJson('/api/v1/products/99999');

    $response-&amp;gt;assertNotFound();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
---

☸️ **PART 3 — Kubernetes (K8s)**

**Kubernetes কী?**

Kubernetes হলো **Container Orchestration** Platform। অনেক Container কে Manage, Scale, ও Monitor করার Tool।
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
yaml&lt;br&gt;
Docker = একটা Container চালানো&lt;br&gt;
Kubernetes = হাজারো Container পরিচালনা করা&lt;/p&gt;

&lt;p&gt;Kubernetes এর কাজ:&lt;br&gt;
├── Auto Scaling     → Traffic বাড়লে Container বাড়াও&lt;br&gt;
├── Self Healing     → Container Crash করলে নতুন তৈরি করো&lt;br&gt;
├── Load Balancing   → Traffic ভাগ করো&lt;br&gt;
├── Rolling Update   → Zero-downtime Deploy করো&lt;br&gt;
└── Service Discovery→ Services খুঁজে পেতে সাহায্য করো&lt;/p&gt;

&lt;p&gt;Kubernetes Architecture:&lt;br&gt;
┌─────────────────────────────────────────────┐&lt;br&gt;
│              Control Plane                   │&lt;br&gt;
│  ┌──────────┐ ┌──────────┐ ┌─────────────┐ │&lt;br&gt;
│  │ API      │ │Scheduler │ │  Controller  │ │&lt;br&gt;
│  │ Server   │ │          │ │  Manager     │ │&lt;br&gt;
│  └──────────┘ └──────────┘ └─────────────┘ │&lt;br&gt;
└─────────────────────────────────────────────┘&lt;br&gt;
         ↓ Manages&lt;br&gt;
┌─────────────────────────────────────────────┐&lt;br&gt;
│                Worker Nodes                  │&lt;br&gt;
│  ┌────────────────┐  ┌────────────────┐     │&lt;br&gt;
│  │   Node 1       │  │   Node 2       │     │&lt;br&gt;
│  │  ┌──────────┐  │  │  ┌──────────┐  │     │&lt;br&gt;
│  │  │  Pod     │  │  │  │  Pod     │  │     │&lt;br&gt;
│  │  │(Container│  │  │  │(Container│  │     │&lt;br&gt;
│  │  │+Laravel) │  │  │  │+Laravel) │  │     │&lt;br&gt;
│  │  └──────────┘  │  │  └──────────┘  │     │&lt;br&gt;
│  └────────────────┘  └────────────────┘     │&lt;br&gt;
└─────────────────────────────────────────────┘&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Laravel App এর জন্য Kubernetes Manifests:**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
yaml&lt;/p&gt;
&lt;h1&gt;
  
  
  k8s/namespace.yml
&lt;/h1&gt;

&lt;p&gt;apiVersion: v1&lt;br&gt;
kind: Namespace&lt;br&gt;
metadata:&lt;br&gt;
  name: laravel-app&lt;br&gt;
  labels:&lt;br&gt;
    app: laravel&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
plaintext&lt;br&gt;
yaml&lt;/p&gt;
&lt;h1&gt;
  
  
  k8s/configmap.yml — Non-sensitive Configuration
&lt;/h1&gt;

&lt;p&gt;apiVersion: v1&lt;br&gt;
kind: ConfigMap&lt;br&gt;
metadata:&lt;br&gt;
  name: laravel-config&lt;br&gt;
  namespace: laravel-app&lt;br&gt;
data:&lt;br&gt;
  APP_ENV: production&lt;br&gt;
  APP_DEBUG: "false"&lt;br&gt;
  LOG_CHANNEL: stderr&lt;br&gt;
  CACHE_DRIVER: redis&lt;br&gt;
  QUEUE_CONNECTION: redis&lt;br&gt;
  SESSION_DRIVER: redis&lt;br&gt;
  DB_CONNECTION: mysql&lt;br&gt;
  DB_PORT: "3306"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
yaml&lt;br&gt;
yaml&lt;/p&gt;
&lt;h1&gt;
  
  
  k8s/secret.yml — Sensitive Configuration
&lt;/h1&gt;

&lt;p&gt;apiVersion: v1&lt;br&gt;
kind: Secret&lt;br&gt;
metadata:&lt;br&gt;
  name: laravel-secrets&lt;br&gt;
  namespace: laravel-app&lt;br&gt;
type: Opaque&lt;br&gt;
data:&lt;br&gt;
  # Base64 Encoded Values&lt;br&gt;
  APP_KEY: YmFzZTY0ZW5jb2RlZGtleQ==&lt;br&gt;
  DB_PASSWORD: c2VjcmV0cGFzc3dvcmQ=&lt;br&gt;
  REDIS_PASSWORD: cmVkaXNwYXNz&lt;br&gt;
  JWT_SECRET: and0c2VjcmV0a2V5&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
yaml&lt;br&gt;
yaml&lt;/p&gt;
&lt;h1&gt;
  
  
  k8s/deployment.yml — Laravel App Deployment
&lt;/h1&gt;

&lt;p&gt;apiVersion: apps/v1&lt;br&gt;
kind: Deployment&lt;br&gt;
metadata:&lt;br&gt;
  name: laravel-app&lt;br&gt;
  namespace: laravel-app&lt;br&gt;
  labels:&lt;br&gt;
    app: laravel&lt;br&gt;
    version: "1.0"&lt;br&gt;
spec:&lt;br&gt;
  replicas: 3             # ৩টা Instance চালাবে&lt;br&gt;
  selector:&lt;br&gt;
    matchLabels:&lt;br&gt;
      app: laravel&lt;br&gt;
  strategy:&lt;br&gt;
    type: RollingUpdate   # Zero-downtime Update&lt;br&gt;
    rollingUpdate:&lt;br&gt;
      maxSurge: 1         # একটা বেশি তৈরি করো&lt;br&gt;
      maxUnavailable: 0   # কোনটা বন্ধ করো না&lt;/p&gt;

&lt;p&gt;template:&lt;br&gt;
    metadata:&lt;br&gt;
      labels:&lt;br&gt;
        app: laravel&lt;br&gt;
    spec:&lt;br&gt;
      containers:&lt;br&gt;
        - name: laravel&lt;br&gt;
          image: ghcr.io/myapp/laravel:latest&lt;br&gt;
          imagePullPolicy: Always&lt;br&gt;
          ports:&lt;br&gt;
            - containerPort: 9000&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Environment Variables
      envFrom:
        - configMapRef:
            name: laravel-config
        - secretRef:
            name: laravel-secrets

      # Resource Limits — একটা Pod বেশি Resource নিতে পারবে না
      resources:
        requests:
          memory: "256Mi"
          cpu: "250m"
        limits:
          memory: "512Mi"
          cpu: "500m"

      # Health Checks
      livenessProbe:
        httpGet:
          path: /health
          port: 80
        initialDelaySeconds: 30
        periodSeconds: 10
        failureThreshold: 3

      readinessProbe:
        httpGet:
          path: /health/ready
          port: 80
        initialDelaySeconds: 10
        periodSeconds: 5

      # Lifecycle Hooks
      lifecycle:
        preStop:
          exec:
            command: ["/bin/sh", "-c", "sleep 10"]  # Graceful shutdown

  # Image Pull Secret
  imagePullSecrets:
    - name: ghcr-secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;yaml# k8s/hpa.yml — Auto Scaling&lt;br&gt;
apiVersion: autoscaling/v2&lt;br&gt;
kind: HorizontalPodAutoscaler&lt;br&gt;
metadata:&lt;br&gt;
  name: laravel-hpa&lt;br&gt;
  namespace: laravel-app&lt;br&gt;
spec:&lt;br&gt;
  scaleTargetRef:&lt;br&gt;
    apiVersion: apps/v1&lt;br&gt;
    kind: Deployment&lt;br&gt;
    name: laravel-app&lt;/p&gt;

&lt;p&gt;minReplicas: 3    # সর্বনিম্ন ৩টা&lt;br&gt;
  maxReplicas: 20   # সর্বোচ্চ ২০টা&lt;/p&gt;

&lt;p&gt;metrics:&lt;br&gt;
    # CPU বেশি হলে Scale করুন&lt;br&gt;
    - type: Resource&lt;br&gt;
      resource:&lt;br&gt;
        name: cpu&lt;br&gt;
        target:&lt;br&gt;
          type: Utilization&lt;br&gt;
          averageUtilization: 70  # ৭০% CPU হলে নতুন Pod&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Memory বেশি হলে Scale করুন
- type: Resource
  resource:
    name: memory
    target:
      type: Utilization
      averageUtilization: 80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;behavior:&lt;br&gt;
    scaleUp:&lt;br&gt;
      stabilizationWindowSeconds: 60   # ১ মিনিট দেখো&lt;br&gt;
      policies:&lt;br&gt;
        - type: Pods&lt;br&gt;
          value: 3                      # একসাথে ৩টা যোগ করো&lt;br&gt;
          periodSeconds: 60&lt;br&gt;
    scaleDown:&lt;br&gt;
      stabilizationWindowSeconds: 300  # ৫ মিনিট দেখো তারপর কমাও&lt;br&gt;
yaml# k8s/queue-worker.yml — Queue Worker Deployment&lt;br&gt;
apiVersion: apps/v1&lt;br&gt;
kind: Deployment&lt;br&gt;
metadata:&lt;br&gt;
  name: laravel-queue&lt;br&gt;
  namespace: laravel-app&lt;br&gt;
spec:&lt;br&gt;
  replicas: 2&lt;/p&gt;

&lt;p&gt;template:&lt;br&gt;
    spec:&lt;br&gt;
      containers:&lt;br&gt;
        - name: queue-worker&lt;br&gt;
          image: ghcr.io/myapp/laravel:latest&lt;br&gt;
          command:&lt;br&gt;
            - php&lt;br&gt;
            - artisan&lt;br&gt;
            - queue:work&lt;br&gt;
            - redis&lt;br&gt;
            - --sleep=3&lt;br&gt;
            - --tries=3&lt;br&gt;
            - --timeout=90&lt;br&gt;
            - --queue=high-priority,default,low-priority&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      envFrom:
        - configMapRef:
            name: laravel-config
        - secretRef:
            name: laravel-secrets

      resources:
        requests:
          memory: "128Mi"
          cpu: "100m"
        limits:
          memory: "256Mi"
          cpu: "250m"

      # Queue Worker Health Check
      livenessProbe:
        exec:
          command:
            - php
            - artisan
            - queue:monitor
            - --max=100
        initialDelaySeconds: 60
        periodSeconds: 60
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;yaml# k8s/service.yml — Service (Load Balancer)&lt;br&gt;
apiVersion: v1&lt;br&gt;
kind: Service&lt;br&gt;
metadata:&lt;br&gt;
  name: laravel-service&lt;br&gt;
  namespace: laravel-app&lt;br&gt;
spec:&lt;br&gt;
  selector:&lt;br&gt;
    app: laravel&lt;br&gt;
  ports:&lt;br&gt;
    - protocol: TCP&lt;br&gt;
      port: 80&lt;br&gt;
      targetPort: 80&lt;br&gt;
  type: ClusterIP&lt;/p&gt;


&lt;h1&gt;
  
  
  k8s/ingress.yml — External Access
&lt;/h1&gt;

&lt;p&gt;apiVersion: networking.k8s.io/v1&lt;br&gt;
kind: Ingress&lt;br&gt;
metadata:&lt;br&gt;
  name: laravel-ingress&lt;br&gt;
  namespace: laravel-app&lt;br&gt;
  annotations:&lt;br&gt;
    # Nginx Ingress Controller&lt;br&gt;
    nginx.ingress.kubernetes.io/rewrite-target: /&lt;br&gt;
    # SSL Auto-renew&lt;br&gt;
    cert-manager.io/cluster-issuer: "letsencrypt-prod"&lt;br&gt;
    # Rate Limiting&lt;br&gt;
    nginx.ingress.kubernetes.io/rate-limit: "100"&lt;br&gt;
    nginx.ingress.kubernetes.io/rate-limit-window: "1m"&lt;br&gt;
spec:&lt;br&gt;
  ingressClassName: nginx&lt;br&gt;
  tls:&lt;br&gt;
    - hosts:&lt;br&gt;
        - myapp.com&lt;br&gt;
      secretName: myapp-tls&lt;br&gt;
  rules:&lt;br&gt;
    - host: myapp.com&lt;br&gt;
      http:&lt;br&gt;
        paths:&lt;br&gt;
          - path: /&lt;br&gt;
            pathType: Prefix&lt;br&gt;
            backend:&lt;br&gt;
              service:&lt;br&gt;
                name: laravel-service&lt;br&gt;
                port:&lt;br&gt;
                  number: 80&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Kubernetes Commands — Daily Use:**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
yaml&lt;br&gt;
bash&lt;/p&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Deploy করুন
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;

&lt;p&gt;kubectl apply -f k8s/           # সব yaml apply করুন&lt;br&gt;
kubectl apply -f k8s/deployment.yml&lt;/p&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Status দেখুন
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;

&lt;p&gt;kubectl get pods -n laravel-app&lt;br&gt;
kubectl get deployments -n laravel-app&lt;br&gt;
kubectl get services -n laravel-app&lt;br&gt;
kubectl get hpa -n laravel-app         # Auto Scaling Status&lt;/p&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Logs দেখুন
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;

&lt;p&gt;kubectl logs -f deployment/laravel-app -n laravel-app&lt;br&gt;
kubectl logs -f pod/laravel-app-xxx -n laravel-app&lt;/p&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Pod এ ঢুকুন
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;

&lt;p&gt;kubectl exec -it deployment/laravel-app \&lt;br&gt;
  -n laravel-app -- bash&lt;/p&gt;
&lt;h1&gt;
  
  
  Laravel Commands Run করুন
&lt;/h1&gt;

&lt;p&gt;kubectl exec -it deployment/laravel-app \&lt;br&gt;
  -n laravel-app -- php artisan migrate&lt;/p&gt;

&lt;p&gt;kubectl exec -it deployment/laravel-app \&lt;br&gt;
  -n laravel-app -- php artisan tinker&lt;/p&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Scale করুন
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;

&lt;p&gt;kubectl scale deployment laravel-app \&lt;br&gt;
  --replicas=5 -n laravel-app&lt;/p&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Rolling Update — Zero Downtime
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;

&lt;p&gt;kubectl set image deployment/laravel-app \&lt;br&gt;
  laravel=ghcr.io/myapp/laravel:v2.0 \&lt;br&gt;
  -n laravel-app&lt;/p&gt;

&lt;p&gt;kubectl rollout status deployment/laravel-app -n laravel-app&lt;/p&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Rollback করুন — কিছু ভুল হলে
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;

&lt;p&gt;kubectl rollout undo deployment/laravel-app -n laravel-app&lt;br&gt;
kubectl rollout undo deployment/laravel-app \&lt;br&gt;
  --to-revision=3 -n laravel-app&lt;/p&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Resource Usage দেখুন
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;

&lt;p&gt;kubectl top pods -n laravel-app&lt;br&gt;
kubectl top nodes&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🏥 **PART 4 — Health Check Endpoint**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
yaml&lt;br&gt;
php&lt;br&gt;
// routes/api.php&lt;br&gt;
Route::get('/health', [HealthController::class, 'check']);&lt;br&gt;
Route::get('/health/ready', [HealthController::class, 'readiness']);&lt;br&gt;
Route::get('/health/live', [HealthController::class, 'liveness']);&lt;/p&gt;

&lt;p&gt;// app/Http/Controllers/HealthController.php&lt;br&gt;
class HealthController extends Controller&lt;br&gt;
{&lt;br&gt;
    // Liveness — Container জীবিত আছে?&lt;br&gt;
    public function liveness(): JsonResponse&lt;br&gt;
    {&lt;br&gt;
        return response()-&amp;gt;json([&lt;br&gt;
            'status'    =&amp;gt; 'alive',&lt;br&gt;
            'timestamp' =&amp;gt; now()-&amp;gt;toIso8601String(),&lt;br&gt;
        ]);&lt;br&gt;
    }&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Readiness — Traffic নেওয়ার জন্য Ready?
public function readiness(): JsonResponse
{
    $checks = [];
    $healthy = true;

    // Database Check
    try {
        DB::select('SELECT 1');
        $checks['database'] = 'ok';
    } catch (\Exception $e) {
        $checks['database'] = 'fail';
        $healthy = false;
    }

    // Redis Check
    try {
        Redis::ping();
        $checks['redis'] = 'ok';
    } catch (\Exception $e) {
        $checks['redis'] = 'fail';
        $healthy = false;
    }

    // Queue Check
    $failedJobs = DB::table('failed_jobs')-&amp;gt;count();
    $checks['queue'] = $failedJobs &amp;lt; 50 ? 'ok' : 'degraded';

    return response()-&amp;gt;json([
        'status' =&amp;gt; $healthy ? 'ready' : 'not_ready',
        'checks' =&amp;gt; $checks,
    ], $healthy ? 200 : 503);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
---


📝 **সংক্ষেপে মনে রাখুন**
**Docker** — আপনার Laravel App এবং সব Dependencies একটা Container এ রাখুন। যেকোনো Server এ একই ভাবে চলবে। Local Development এ `docker-compose` ব্যবহার করুন।
**CI/CD** — GitHub Actions দিয়ে Code Push করলেই Auto Test, Build, Deploy হবে। Test ছাড়া Production এ যাবে না। এতে Human Error কমে।
**Kubernetes** — Production এ অনেক Container Manage করার জন্য। Auto Scaling, Self-healing, Zero-downtime Deploy — সব পাবেন। ছোট Project এ দরকার নেই, বড় হলে অপরিহার্য।
**শেখার ক্রম** — প্রথমে Docker শিখুন → তারপর GitHub Actions দিয়ে CI/CD → পরে Kubernetes।

**_Q:8_** - **Performance Optimization (profiling, load balancing)**
**Answer**: 

⚡ **Performance কেন গুরুত্বপূর্ণ?**
গবেষণা বলছে:

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
shell&lt;br&gt;
├── 1 সেকেন্ড Delay   → ৭% Conversion কমে&lt;br&gt;
├── 3 সেকেন্ড Delay   → ৫৩% Mobile User চলে যায়&lt;br&gt;
├── Google Ranking    → Page Speed একটা Factor&lt;br&gt;
└── Amazon: ১০০ms    → ১% Revenue কমে&lt;/p&gt;

&lt;p&gt;আদর্শ Response Time:&lt;br&gt;
├── API Response    → &amp;lt; 200ms   ✅ খুব ভালো&lt;br&gt;
├── Page Load       → &amp;lt; 1s      ✅ ভালো&lt;br&gt;
├── Complex Report  → &amp;lt; 3s      ⚠️ গ্রহণযোগ্য&lt;br&gt;
└── যেকোনো কিছু    → &amp;gt; 5s      ❌ User চলে যাবে&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
---

🔍 **PART 1 — Profiling (সমস্যা খুঁজে বের করা)**
**Profiling কী?**
Profiling মানে আপনার অ্যাপের **কোথায় সময় নষ্ট হচ্ছে** সেটা খুঁজে বের করা। Optimize করার আগে অবশ্যই Profile করুন।

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
❌ ভুল পদ্ধতি:&lt;br&gt;
"মনে হচ্ছে Database Slow" → সেটা Optimize করলাম&lt;br&gt;
→ কোনো পার্থক্য নেই!&lt;/p&gt;

&lt;p&gt;✅ সঠিক পদ্ধতি:&lt;br&gt;
Profile করুন → সমস্যা খুঁজুন → সেটা Fix করুন&lt;br&gt;
→ আবার Profile করুন → Verify করুন&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Laravel Telescope — Development Profiling:**

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
plaintext&lt;br&gt;
bash&lt;br&gt;
composer require laravel/telescope --dev&lt;br&gt;
php artisan telescope:install&lt;br&gt;
php artisan migrate&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
plaintext&lt;br&gt;
php&lt;br&gt;
// config/telescope.php&lt;br&gt;
return [&lt;br&gt;
    'enabled' =&amp;gt; env('TELESCOPE_ENABLED', true),&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// কী কী Track করবেন
'watchers' =&amp;gt; [
    Watchers\QueryWatcher::class =&amp;gt; [
        'enabled' =&amp;gt; true,
        'slow'    =&amp;gt; 100, // ১০০ms এর বেশি = Slow Query Alert
    ],
    Watchers\RequestWatcher::class =&amp;gt; [
        'enabled'          =&amp;gt; true,
        'size_limit'       =&amp;gt; env('TELESCOPE_RESPONSE_SIZE_LIMIT', 64),
    ],
    Watchers\CacheWatcher::class  =&amp;gt; ['enabled' =&amp;gt; true],
    Watchers\JobWatcher::class    =&amp;gt; ['enabled' =&amp;gt; true],
    Watchers\MailWatcher::class   =&amp;gt; ['enabled' =&amp;gt; true],
    Watchers\ModelWatcher::class  =&amp;gt; [
        'enabled' =&amp;gt; true,
        'events'  =&amp;gt; ['eloquent.created*', 'eloquent.updated*'],
    ],
],
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;];&lt;/p&gt;

&lt;p&gt;// app/Providers/TelescopeServiceProvider.php&lt;br&gt;
class TelescopeServiceProvider extends ServiceProvider&lt;br&gt;
{&lt;br&gt;
    public function register(): void&lt;br&gt;
    {&lt;br&gt;
        Telescope::night(); // Dark Mode&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    // Slow Query হলে Alert দিন
    Telescope::filter(function (IncomingEntry $entry) {
        if ($entry-&amp;gt;type === EntryType::QUERY) {
            return $entry-&amp;gt;content['slow'] ?? false;
        }
        return true;
    });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Custom Profiler — Detailed Performance Tracking:**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
shell&lt;br&gt;
php&lt;br&gt;
// app/Services/PerformanceProfiler.php&lt;br&gt;
class PerformanceProfiler&lt;br&gt;
{&lt;br&gt;
    private array $timings  = [];&lt;br&gt;
    private array $memories = [];&lt;br&gt;
    private float $startTime;&lt;br&gt;
    private int   $startMemory;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function start(string $label): void
{
    $this-&amp;gt;timings[$label]  = microtime(true);
    $this-&amp;gt;memories[$label] = memory_get_usage(true);
}

public function end(string $label): array
{
    $duration    = (microtime(true) - $this-&amp;gt;timings[$label]) * 1000;
    $memoryUsed  = memory_get_usage(true) - $this-&amp;gt;memories[$label];

    $result = [
        'label'       =&amp;gt; $label,
        'duration_ms' =&amp;gt; round($duration, 2),
        'memory_kb'   =&amp;gt; round($memoryUsed / 1024, 2),
        'slow'        =&amp;gt; $duration &amp;gt; 100, // ১০০ms এর বেশি = Slow
    ];

    // Slow Operation Log করুন
    if ($result['slow']) {
        Log::warning("Slow Operation Detected", $result);
    }

    return $result;
}

public function measure(string $label, callable $callback): mixed
{
    $this-&amp;gt;start($label);
    $result = $callback();
    $timing = $this-&amp;gt;end($label);

    return $result;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;// ব্যবহার&lt;br&gt;
class DashboardController extends Controller&lt;br&gt;
{&lt;br&gt;
    public function index(PerformanceProfiler $profiler): JsonResponse&lt;br&gt;
    {&lt;br&gt;
        $profiler-&amp;gt;start('total_dashboard');&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    // Products Load
    $products = $profiler-&amp;gt;measure('load_products', function () {
        return Product::with(['category', 'brand'])
                      -&amp;gt;where('status', 'active')
                      -&amp;gt;take(20)
                      -&amp;gt;get();
    });

    // Sales Report
    $salesData = $profiler-&amp;gt;measure('load_sales', function () {
        return Order::selectRaw('DATE(created_at) as date, SUM(total) as revenue')
                    -&amp;gt;whereBetween('created_at', [
                        now()-&amp;gt;subDays(30),
                        now()
                    ])
                    -&amp;gt;groupBy('date')
                    -&amp;gt;get();
    });

    // User Stats
    $userStats = $profiler-&amp;gt;measure('load_user_stats', function () {
        return [
            'total'  =&amp;gt; User::count(),
            'active' =&amp;gt; User::where('last_login_at', '&amp;gt;', now()-&amp;gt;subDays(7))-&amp;gt;count(),
            'new'    =&amp;gt; User::whereDate('created_at', today())-&amp;gt;count(),
        ];
    });

    $totalTime = $profiler-&amp;gt;end('total_dashboard');

    // Production এ Log করুন
    if (app()-&amp;gt;environment('production')) {
        Log::info('Dashboard Performance', [
            'total_ms'   =&amp;gt; $totalTime['duration_ms'],
            'user_id'    =&amp;gt; auth()-&amp;gt;id(),
            'request_id' =&amp;gt; request()-&amp;gt;header('X-Request-ID'),
        ]);
    }

    return response()-&amp;gt;json([
        'products'   =&amp;gt; $products,
        'sales'      =&amp;gt; $salesData,
        'user_stats' =&amp;gt; $userStats,
        '_debug'     =&amp;gt; app()-&amp;gt;environment('local') ? $totalTime : null,
    ]);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Query Profiling — Slow Query খুঁজুন:**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
php&lt;br&gt;
// app/Providers/AppServiceProvider.php&lt;br&gt;
public function boot(): void&lt;br&gt;
{&lt;br&gt;
    if (config('app.debug')) {&lt;br&gt;
        // সব Query Log করুন&lt;br&gt;
        DB::listen(function (QueryExecuted $query) {&lt;br&gt;
            $duration = $query-&amp;gt;time; // milliseconds&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        // ১০০ms এর বেশি হলে Log করুন
        if ($duration &amp;gt; 100) {
            Log::warning('Slow Query Detected', [
                'sql'        =&amp;gt; $query-&amp;gt;sql,
                'bindings'   =&amp;gt; $query-&amp;gt;bindings,
                'duration'   =&amp;gt; "{$duration}ms",
                'connection' =&amp;gt; $query-&amp;gt;connectionName,
                'trace'      =&amp;gt; collect(debug_backtrace())
                                -&amp;gt;take(5)
                                -&amp;gt;pluck('file')
                                -&amp;gt;toArray(),
            ]);
        }
    });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;// Query Analysis — EXPLAIN দিয়ে&lt;br&gt;
class QueryAnalyzer&lt;br&gt;
{&lt;br&gt;
    public function explain(string $sql, array $bindings = []): array&lt;br&gt;
    {&lt;br&gt;
        // MySQL EXPLAIN — Query Plan দেখুন&lt;br&gt;
        $explained = DB::select("EXPLAIN " . $sql, $bindings);&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    $issues = [];

    foreach ($explained as $row) {
        // Full Table Scan — Index নেই!
        if ($row-&amp;gt;type === 'ALL') {
            $issues[] = [
                'type'    =&amp;gt; 'full_table_scan',
                'table'   =&amp;gt; $row-&amp;gt;table,
                'rows'    =&amp;gt; $row-&amp;gt;rows,
                'message' =&amp;gt; "⚠️ {$row-&amp;gt;table} এ Full Table Scan!
                              Index যোগ করুন।",
            ];
        }

        // No Index Used
        if (empty($row-&amp;gt;key)) {
            $issues[] = [
                'type'    =&amp;gt; 'no_index',
                'table'   =&amp;gt; $row-&amp;gt;table,
                'message' =&amp;gt; "⚠️ {$row-&amp;gt;table} এ কোনো Index ব্যবহার
                              হচ্ছে না।",
            ];
        }
    }

    return [
        'plan'   =&amp;gt; $explained,
        'issues' =&amp;gt; $issues,
    ];
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
---


🚀 **PART 2 — Laravel Specific Optimizations**
**Database Optimization:**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
php&lt;br&gt;
// ─────────────────────────────────────&lt;br&gt;
// ১. N+1 Query Problem — সবচেয়ে Common&lt;br&gt;
// ─────────────────────────────────────&lt;/p&gt;

&lt;p&gt;// ❌ ভুল — ১০১টা Query!&lt;br&gt;
$orders = Order::all(); // 1 Query&lt;br&gt;
foreach ($orders as $order) {&lt;br&gt;
    echo $order-&amp;gt;user-&amp;gt;name;    // +1 Query প্রতিটায়&lt;br&gt;
    echo $order-&amp;gt;product-&amp;gt;name; // +1 Query প্রতিটায়&lt;br&gt;
}&lt;br&gt;
// ১০০ Orders = ২০১ Queries!&lt;/p&gt;

&lt;p&gt;// ✅ সঠিক — মাত্র ৩টা Query&lt;br&gt;
$orders = Order::with(['user', 'product', 'payment'])&lt;br&gt;
               -&amp;gt;get();&lt;/p&gt;

&lt;p&gt;// ✅ আরো ভালো — দরকারী Field শুধু নিন&lt;br&gt;
$orders = Order::with([&lt;br&gt;
    'user:id,name,email',       // শুধু এই Fields&lt;br&gt;
    'product:id,name,price',    // শুধু এই Fields&lt;br&gt;
])&lt;br&gt;
-&amp;gt;select(['id', 'user_id', 'product_id', 'total', 'status'])&lt;br&gt;
-&amp;gt;get();&lt;/p&gt;

&lt;p&gt;// ─────────────────────────────────────&lt;br&gt;
// ২. Select Only Required Columns&lt;br&gt;
// ─────────────────────────────────────&lt;/p&gt;

&lt;p&gt;// ❌ ভুল — সব Column নিচ্ছে (SELECT *)&lt;br&gt;
$users = User::all();&lt;/p&gt;

&lt;p&gt;// ✅ সঠিক — দরকারী Column শুধু&lt;br&gt;
$users = User::select(['id', 'name', 'email', 'created_at'])-&amp;gt;get();&lt;/p&gt;

&lt;p&gt;// ─────────────────────────────────────&lt;br&gt;
// ৩. Index Optimization&lt;br&gt;
// ─────────────────────────────────────&lt;br&gt;
class AddPerformanceIndexes extends Migration&lt;br&gt;
{&lt;br&gt;
    public function up(): void&lt;br&gt;
    {&lt;br&gt;
        // Single Column Index&lt;br&gt;
        Schema::table('orders', function (Blueprint $table) {&lt;br&gt;
            $table-&amp;gt;index('status');&lt;br&gt;
            $table-&amp;gt;index('user_id');&lt;br&gt;
            $table-&amp;gt;index('created_at');&lt;br&gt;
        });&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    // Composite Index — একসাথে filter করলে
    Schema::table('orders', function (Blueprint $table) {
        // WHERE user_id = ? AND status = ?
        $table-&amp;gt;index(['user_id', 'status']);

        // WHERE status = ? ORDER BY created_at DESC
        $table-&amp;gt;index(['status', 'created_at']);
    });

    // Covering Index — Index থেকেই সব Data পাবে, Table যেতে হবে না
    Schema::table('products', function (Blueprint $table) {
        // SELECT id, name, price WHERE category_id = ? AND status = ?
        $table-&amp;gt;index(['category_id', 'status', 'id', 'name', 'price']);
    });

    // Full-text Index — Search এর জন্য
    Schema::table('products', function (Blueprint $table) {
        $table-&amp;gt;fullText(['name', 'description']);
    });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;// ─────────────────────────────────────&lt;br&gt;
// ৪. Query Chunking — Memory Optimize&lt;br&gt;
// ─────────────────────────────────────&lt;/p&gt;

&lt;p&gt;// ❌ ভুল — লক্ষ Row Memory তে Load&lt;br&gt;
$products = Product::all(); // Out of Memory!&lt;/p&gt;

&lt;p&gt;// ✅ সঠিক — Chunk করে Process&lt;br&gt;
Product::chunkById(1000, function (Collection $products) {&lt;br&gt;
    foreach ($products as $product) {&lt;br&gt;
        // Process করুন&lt;br&gt;
        $this-&amp;gt;processProduct($product);&lt;br&gt;
    }&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;// ✅ আরো ভালো — Lazy Collection&lt;br&gt;
Product::lazy(500)-&amp;gt;each(function (Product $product) {&lt;br&gt;
    $this-&amp;gt;processProduct($product);&lt;br&gt;
    // Memory: শুধু ৫০০টা একসাথে&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;// ─────────────────────────────────────&lt;br&gt;
// ৫. Aggregate Query Optimization&lt;br&gt;
// ─────────────────────────────────────&lt;/p&gt;

&lt;p&gt;// ❌ ভুল — সব Record Load করে Count&lt;br&gt;
$total = Order::where('status', 'completed')-&amp;gt;get()-&amp;gt;count();&lt;/p&gt;

&lt;p&gt;// ✅ সঠিক — DB তেই Count করুন&lt;br&gt;
$total = Order::where('status', 'completed')-&amp;gt;count();&lt;/p&gt;

&lt;p&gt;// ❌ ভুল — PHP তে Sum করুন&lt;br&gt;
$revenue = Order::where('status', 'completed')&lt;br&gt;
                -&amp;gt;get()&lt;br&gt;
                -&amp;gt;sum('total');&lt;/p&gt;

&lt;p&gt;// ✅ সঠিক — DB তে Sum করুন&lt;br&gt;
$revenue = Order::where('status', 'completed')-&amp;gt;sum('total');&lt;/p&gt;

&lt;p&gt;// Multiple Aggregates একসাথে&lt;br&gt;
$stats = Order::where('status', 'completed')&lt;br&gt;
              -&amp;gt;selectRaw('&lt;br&gt;
                COUNT(*) as total_orders,&lt;br&gt;
                SUM(total) as total_revenue,&lt;br&gt;
                AVG(total) as avg_order_value,&lt;br&gt;
                MAX(total) as highest_order,&lt;br&gt;
                MIN(total) as lowest_order&lt;br&gt;
              ')&lt;br&gt;
              -&amp;gt;first();&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Laravel Cache Optimization:**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
php&lt;br&gt;
// app/Services/OptimizedProductService.php&lt;br&gt;
class OptimizedProductService&lt;br&gt;
{&lt;br&gt;
    // ─────────────────────────────────────&lt;br&gt;
    // Multi-level Cache&lt;br&gt;
    // ─────────────────────────────────────&lt;br&gt;
    private array $localCache = []; // Request-level Cache&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function getProduct(int $id): ?Product
{
    // Level 1: Local Array Cache (সবচেয়ে দ্রুত)
    if (isset($this-&amp;gt;localCache["product:{$id}"])) {
        return $this-&amp;gt;localCache["product:{$id}"];
    }

    // Level 2: Redis Cache
    $product = Cache::remember(
        "product:{$id}",
        now()-&amp;gt;addHours(6),
        // Level 3: Database
        fn() =&amp;gt; Product::with(['category:id,name', 'brand:id,name'])
                        -&amp;gt;find($id)
    );

    // Local Cache এ রাখুন
    $this-&amp;gt;localCache["product:{$id}"] = $product;

    return $product;
}

// ─────────────────────────────────────
// Batch Cache Loading
// ─────────────────────────────────────
public function getProducts(array $ids): Collection
{
    // Cache থেকে যা আছে নিন
    $cached    = [];
    $missing   = [];

    foreach ($ids as $id) {
        $product = Cache::get("product:{$id}");
        if ($product) {
            $cached[$id] = $product;
        } else {
            $missing[] = $id;
        }
    }

    // শুধু Missing গুলো DB থেকে নিন
    if (!empty($missing)) {
        $products = Product::with(['category', 'brand'])
                           -&amp;gt;whereIn('id', $missing)
                           -&amp;gt;get()
                           -&amp;gt;keyBy('id');

        // Cache এ রাখুন — Pipeline দিয়ে (দ্রুত)
        Redis::pipeline(function ($pipe) use ($products) {
            foreach ($products as $product) {
                $pipe-&amp;gt;setex(
                    "product:{$product-&amp;gt;id}",
                    3600 * 6,
                    serialize($product)
                );
            }
        });

        $cached = array_merge($cached, $products-&amp;gt;toArray());
    }

    return collect($cached);
}

// ─────────────────────────────────────
// Computed Properties Cache
// ─────────────────────────────────────
public function getProductStats(int $productId): array
{
    return Cache::remember(
        "product:{$productId}:stats",
        now()-&amp;gt;addMinutes(30),
        function () use ($productId) {
            return [
                'total_sold'   =&amp;gt; OrderItem::where('product_id', $productId)
                                           -&amp;gt;sum('quantity'),
                'revenue'      =&amp;gt; OrderItem::where('product_id', $productId)
                                           -&amp;gt;sum(DB::raw('quantity * price')),
                'avg_rating'   =&amp;gt; Review::where('product_id', $productId)
                                        -&amp;gt;avg('rating'),
                'review_count' =&amp;gt; Review::where('product_id', $productId)
                                        -&amp;gt;count(),
                'view_count'   =&amp;gt; (int) Redis::get("product:{$productId}:views"),
            ];
        }
    );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**PHP OpCode Cache &amp;amp; Configuration:**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
ini&lt;br&gt;
; php.ini / docker/php/php.ini&lt;/p&gt;

&lt;p&gt;; ─────────────────────────────────────&lt;br&gt;
; OPcache — PHP Code Cache&lt;br&gt;
; ─────────────────────────────────────&lt;br&gt;
opcache.enable=1&lt;br&gt;
opcache.enable_cli=1&lt;br&gt;
opcache.memory_consumption=256      ; 256MB&lt;br&gt;
opcache.interned_strings_buffer=16  ; 16MB&lt;br&gt;
opcache.max_accelerated_files=20000 ; File Count&lt;br&gt;
opcache.revalidate_freq=0           ; Production: 0 (Never Recheck)&lt;br&gt;
opcache.validate_timestamps=0       ; Production: 0&lt;br&gt;
opcache.save_comments=1&lt;br&gt;
opcache.fast_shutdown=1&lt;/p&gt;

&lt;p&gt;; ─────────────────────────────────────&lt;br&gt;
; PHP Configuration&lt;br&gt;
; ─────────────────────────────────────&lt;br&gt;
memory_limit=512M&lt;br&gt;
max_execution_time=60&lt;br&gt;
max_input_time=60&lt;br&gt;
upload_max_filesize=20M&lt;br&gt;
post_max_size=20M&lt;/p&gt;

&lt;p&gt;; Realpath Cache&lt;br&gt;
realpath_cache_size=4096K&lt;br&gt;
realpath_cache_ttl=600&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
php&lt;br&gt;
// Laravel Production Optimization Commands&lt;br&gt;
// Deploy এর সময় চালান:&lt;/p&gt;

&lt;p&gt;// php artisan optimize — সব একসাথে&lt;br&gt;
// অথবা আলাদা আলাদা:&lt;br&gt;
php artisan config:cache   // Config Cache করুন&lt;br&gt;
php artisan route:cache    // Route Cache করুন&lt;br&gt;
php artisan view:cache     // Blade View Cache করুন&lt;br&gt;
php artisan event:cache    // Event Cache করুন&lt;/p&gt;

&lt;p&gt;// app/Console/Commands/OptimizeForProduction.php&lt;br&gt;
class OptimizeForProduction extends Command&lt;br&gt;
{&lt;br&gt;
    protected $signature   = 'app:optimize-production';&lt;br&gt;
    protected $description = 'Production Optimization চালান';&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function handle(): void
{
    $this-&amp;gt;info('🚀 Optimization শুরু হচ্ছে...');

    $steps = [
        ['php artisan config:cache',  'Config Cache'],
        ['php artisan route:cache',   'Route Cache'],
        ['php artisan view:cache',    'View Cache'],
        ['php artisan event:cache',   'Event Cache'],
        ['php artisan icons:cache',   'Icons Cache'],
    ];

    foreach ($steps as [$command, $label]) {
        $this-&amp;gt;call(trim(str_replace('php artisan ', '', $command)));
        $this-&amp;gt;line("  ✅ {$label} সম্পন্ন");
    }

    // Cache Warm করুন
    $this-&amp;gt;call('cache:warm');
    $this-&amp;gt;line("  ✅ Cache Warm সম্পন্ন");

    $this-&amp;gt;info('✨ Optimization সম্পন্ন!');
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
---

⚖️ **PART 3 — Load Balancing**

**Load Balancing কী?**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
Load Balancing = Traffic কে একাধিক Server এ ভাগ করা&lt;/p&gt;

&lt;p&gt;একটা Server:&lt;br&gt;
[১০০০ Requests] → [Server 1] ← Overwhelmed! 😰&lt;/p&gt;

&lt;p&gt;Load Balanced:&lt;br&gt;
[১০০০ Requests] → [Load Balancer]&lt;br&gt;
                      ├── [Server 1] ← ৩৩৩ Requests&lt;br&gt;
                      ├── [Server 2] ← ৩৩৩ Requests&lt;br&gt;
                      └── [Server 3] ← ৩৩৪ Requests&lt;/p&gt;

&lt;p&gt;Load Balancing Algorithms:&lt;br&gt;
├── Round Robin      → পালাক্রমে (১→২→৩→১→২→৩)&lt;br&gt;
├── Least Connection → যার Connection কম তাকে দাও&lt;br&gt;
├── IP Hash          → Same User → Same Server&lt;br&gt;
├── Weighted         → শক্তিশালী Server বেশি পাবে&lt;br&gt;
└── Random           → Random Server এ পাঠাও&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Nginx Load Balancer Configuration:**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
nginx&lt;/p&gt;
&lt;h1&gt;
  
  
  /etc/nginx/nginx.conf
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Upstream — Backend Servers Define করুন
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;

&lt;p&gt;upstream laravel_app {&lt;br&gt;
    # Load Balancing Algorithm&lt;br&gt;
    least_conn;  # Least Connection — সবচেয়ে কম Busy Server&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Backend Servers
server 10.0.0.1:9000 weight=3;  # শক্তিশালী — বেশি Traffic পাবে
server 10.0.0.2:9000 weight=2;
server 10.0.0.3:9000 weight=1;

# Health Check — Dead Server বাদ দিন
server 10.0.0.4:9000 backup;    # Primary সব Down হলে Backup

# Keepalive Connections — Performance বাড়ায়
keepalive 32;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h1&gt;
  
  
  API Servers — আলাদা Upstream
&lt;/h1&gt;

&lt;p&gt;upstream laravel_api {&lt;br&gt;
    ip_hash;  # Same User → Same Server (Session Consistency)&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;server 10.0.1.1:9000;
server 10.0.1.2:9000;
server 10.0.1.3:9000;

# Server Down হলে Timeout
server 10.0.1.4:9000 max_fails=3 fail_timeout=30s;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Rate Limiting Zones
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;

&lt;p&gt;limit_req_zone $binary_remote_addr&lt;br&gt;
    zone=api_limit:10m     # 10MB Memory&lt;br&gt;
    rate=100r/m;           # প্রতি মিনিটে ১০০ Request&lt;/p&gt;

&lt;p&gt;limit_req_zone $binary_remote_addr&lt;br&gt;
    zone=login_limit:10m&lt;br&gt;
    rate=5r/m;             # Login: প্রতি মিনিটে ৫ Request&lt;/p&gt;

&lt;p&gt;limit_conn_zone $binary_remote_addr&lt;br&gt;
    zone=conn_limit:10m;   # Connection Limit&lt;/p&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Main Server Block
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;

&lt;p&gt;server {&lt;br&gt;
    listen 443 ssl http2;&lt;br&gt;
    server_name myapp.com;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# SSL
ssl_certificate     /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
ssl_session_cache   shared:SSL:10m;
ssl_session_timeout 10m;

# ─────────────────────────
# Gzip Compression
# ─────────────────────────
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_comp_level 6;
gzip_types
    text/plain
    text/css
    text/javascript
    application/json
    application/javascript
    application/xml
    image/svg+xml;

# ─────────────────────────
# Static Files — CDN থেকে
# ─────────────────────────
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2|ttf)$ {
    expires 1y;
    add_header Cache-Control "public, immutable";
    add_header Vary "Accept-Encoding";

    # CDN Origin — File না থাকলে S3 থেকে নিন
    try_files $uri @cdn_origin;
}

location @cdn_origin {
    proxy_pass https://myapp-assets.s3.amazonaws.com;
}

# ─────────────────────────
# API Routes
# ─────────────────────────
location /api/ {
    # Rate Limiting
    limit_req zone=api_limit burst=20 nodelay;
    limit_conn conn_limit 10;

    proxy_pass http://laravel_api;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Request-ID $request_id;

    # Timeouts
    proxy_connect_timeout 5s;
    proxy_send_timeout 30s;
    proxy_read_timeout 30s;

    # Buffer Settings
    proxy_buffering on;
    proxy_buffer_size 4k;
    proxy_buffers 8 4k;
}

# Login Rate Limiting
location /api/auth/login {
    limit_req zone=login_limit burst=3 nodelay;
    proxy_pass http://laravel_api;
}

# ─────────────────────────
# Web Routes
# ─────────────────────────
location / {
    proxy_pass http://laravel_app;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

# ─────────────────────────
# Health Check
# ─────────────────────────
location /health {
    access_log off;
    proxy_pass http://laravel_app;
}

# ─────────────────────────
# Monitoring
# ─────────────────────────
location /nginx-status {
    stub_status on;
    allow 10.0.0.0/8;    # শুধু Internal IP
    deny all;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**HAProxy — Advanced Load Balancing:**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
ini&lt;br&gt;
haproxy&lt;/p&gt;
&lt;h1&gt;
  
  
  /etc/haproxy/haproxy.cfg
&lt;/h1&gt;

&lt;p&gt;global&lt;br&gt;
    maxconn     50000&lt;br&gt;
    log         /dev/log local0&lt;br&gt;
    user        haproxy&lt;br&gt;
    group       haproxy&lt;br&gt;
    daemon&lt;/p&gt;

&lt;p&gt;defaults&lt;br&gt;
    mode        http&lt;br&gt;
    log         global&lt;br&gt;
    option      httplog&lt;br&gt;
    option      dontlognull&lt;br&gt;
    option      forwardfor&lt;br&gt;
    option      http-server-close&lt;br&gt;
    timeout     connect 5s&lt;br&gt;
    timeout     client  30s&lt;br&gt;
    timeout     server  30s&lt;br&gt;
    retries     3&lt;/p&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Frontend — User Facing
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;

&lt;p&gt;frontend http_front&lt;br&gt;
    bind *:80&lt;br&gt;
    bind *:443 ssl crt /etc/ssl/myapp.pem&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# HTTP → HTTPS Redirect
redirect scheme https if !{ ssl_fc }

# ACL — URL Pattern দিয়ে Route করুন
acl is_api  path_beg /api/
acl is_ws   path_beg /ws/       # WebSocket

# Different Backend এ পাঠান
use_backend api_backend  if is_api
use_backend ws_backend   if is_ws
default_backend web_backend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Web Backend
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;

&lt;p&gt;backend web_backend&lt;br&gt;
    balance     leastconn&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Sticky Session — Same User → Same Server
cookie SERVERID insert indirect nocache

# Health Check
option      httpchk GET /health HTTP/1.1\r\nHost:\ localhost
http-check  expect status 200

server web1 10.0.0.1:80 check cookie s1 weight 100
server web2 10.0.0.2:80 check cookie s2 weight 100
server web3 10.0.0.3:80 check cookie s3 weight 100
server web4 10.0.0.4:80 check cookie s4 backup  # Backup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;
&lt;h1&gt;
  
  
  API Backend
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;

&lt;p&gt;backend api_backend&lt;br&gt;
    balance     roundrobin&lt;br&gt;
    option      httpchk GET /health&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Slow Start — নতুন Server ধীরে ধীরে Traffic নেবে
server api1 10.0.1.1:80 check slowstart 30s
server api2 10.0.1.2:80 check slowstart 30s
server api3 10.0.1.3:80 check slowstart 30s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Stats Dashboard
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ─────────────────────────────────────
&lt;/h1&gt;

&lt;p&gt;listen stats&lt;br&gt;
    bind *:8404&lt;br&gt;
    stats enable&lt;br&gt;
    stats uri /stats&lt;br&gt;
    stats refresh 30s&lt;br&gt;
    stats auth admin:secret_password&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📊 **PART 4 — Application Performance Monitoring (APM)**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
php&lt;br&gt;
// app/Http/Middleware/PerformanceMonitorMiddleware.php&lt;br&gt;
class PerformanceMonitorMiddleware&lt;br&gt;
{&lt;br&gt;
    public function handle(Request $request, Closure $next): Response&lt;br&gt;
    {&lt;br&gt;
        $startTime   = microtime(true);&lt;br&gt;
        $startMemory = memory_get_usage(true);&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    $response = $next($request);

    $duration    = (microtime(true) - $startTime) * 1000;
    $memoryUsed  = (memory_get_usage(true) - $startMemory) / 1024 / 1024;
    $queryCount  = DB::getQueryLog() ? count(DB::getQueryLog()) : 0;
    $peakMemory  = memory_get_peak_usage(true) / 1024 / 1024;

    // Response Header এ দিন — Debug এর জন্য
    if (config('app.debug')) {
        $response-&amp;gt;headers-&amp;gt;set('X-Response-Time', round($duration, 2) . 'ms');
        $response-&amp;gt;headers-&amp;gt;set('X-Memory-Usage', round($memoryUsed, 2) . 'MB');
        $response-&amp;gt;headers-&amp;gt;set('X-Query-Count', $queryCount);
        $response-&amp;gt;headers-&amp;gt;set('X-Peak-Memory', round($peakMemory, 2) . 'MB');
    }

    // Metrics Collect করুন — Prometheus Format
    $this-&amp;gt;recordMetrics([
        'route'       =&amp;gt; $request-&amp;gt;route()?-&amp;gt;getName() ?? 'unknown',
        'method'      =&amp;gt; $request-&amp;gt;method(),
        'status'      =&amp;gt; $response-&amp;gt;getStatusCode(),
        'duration_ms' =&amp;gt; round($duration, 2),
        'memory_mb'   =&amp;gt; round($memoryUsed, 2),
        'queries'     =&amp;gt; $queryCount,
    ]);

    // Slow Request Alert
    if ($duration &amp;gt; 2000) { // ২ সেকেন্ড
        Log::warning('Slow Request Detected', [
            'url'         =&amp;gt; $request-&amp;gt;fullUrl(),
            'method'      =&amp;gt; $request-&amp;gt;method(),
            'duration_ms' =&amp;gt; round($duration, 2),
            'queries'     =&amp;gt; $queryCount,
            'user_id'     =&amp;gt; auth()-&amp;gt;id(),
            'ip'          =&amp;gt; $request-&amp;gt;ip(),
        ]);
    }

    return $response;
}

private function recordMetrics(array $metrics): void
{
    // Redis এ Metrics Store করুন
    $key = "metrics:" . date('Y-m-d-H');

    Redis::pipeline(function ($pipe) use ($key, $metrics) {
        $pipe-&amp;gt;hincrby($key, 'total_requests', 1);
        $pipe-&amp;gt;hincrbyfloat($key, 'total_duration', $metrics['duration_ms']);
        $pipe-&amp;gt;hincrby($key, "status_{$metrics['status']}", 1);

        // Slow Request Count
        if ($metrics['duration_ms'] &amp;gt; 1000) {
            $pipe-&amp;gt;hincrby($key, 'slow_requests', 1);
        }

        // Query Heavy Request
        if ($metrics['queries'] &amp;gt; 20) {
            $pipe-&amp;gt;hincrby($key, 'heavy_query_requests', 1);
        }

        $pipe-&amp;gt;expire($key, 86400 * 7); // ৭ দিন রাখুন
    });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;// Metrics Dashboard&lt;br&gt;
class MetricsDashboardController extends Controller&lt;br&gt;
{&lt;br&gt;
    public function index(): JsonResponse&lt;br&gt;
    {&lt;br&gt;
        $hours = [];&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    for ($i = 23; $i &amp;gt;= 0; $i--) {
        $key  = "metrics:" . now()-&amp;gt;subHours($i)-&amp;gt;format('Y-m-d-H');
        $data = Redis::hgetall($key);

        $totalRequests = (int) ($data['total_requests'] ?? 0);
        $totalDuration = (float) ($data['total_duration'] ?? 0);

        $hours[] = [
            'hour'            =&amp;gt; now()-&amp;gt;subHours($i)-&amp;gt;format('H:00'),
            'total_requests'  =&amp;gt; $totalRequests,
            'avg_response_ms' =&amp;gt; $totalRequests &amp;gt; 0
                                  ? round($totalDuration / $totalRequests, 2)
                                  : 0,
            'slow_requests'   =&amp;gt; (int) ($data['slow_requests'] ?? 0),
            'status_200'      =&amp;gt; (int) ($data['status_200'] ?? 0),
            'status_500'      =&amp;gt; (int) ($data['status_500'] ?? 0),
            'error_rate'      =&amp;gt; $totalRequests &amp;gt; 0
                ? round(($data['status_500'] ?? 0) / $totalRequests * 100, 2)
                : 0,
        ];
    }

    return response()-&amp;gt;json([
        'hourly_metrics' =&amp;gt; $hours,
        'summary'        =&amp;gt; $this-&amp;gt;getSummary($hours),
    ]);
}

private function getSummary(array $hours): array
{
    $totalRequests = array_sum(array_column($hours, 'total_requests'));
    $avgResponse   = collect($hours)
                        -&amp;gt;where('total_requests', '&amp;gt;', 0)
                        -&amp;gt;avg('avg_response_ms');

    return [
        'total_requests_24h' =&amp;gt; $totalRequests,
        'avg_response_ms'    =&amp;gt; round($avgResponse, 2),
        'peak_hour'          =&amp;gt; collect($hours)
                                    -&amp;gt;sortByDesc('total_requests')
                                    -&amp;gt;first()['hour'],
    ];
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
---

🗄️ **PART 5 — Database Connection Pooling**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
plaintext&lt;br&gt;
php&lt;br&gt;
// config/database.php — Connection Pool Configuration&lt;br&gt;
'mysql' =&amp;gt; [&lt;br&gt;
    'driver'   =&amp;gt; 'mysql',&lt;br&gt;
    'host'     =&amp;gt; env('DB_HOST'),&lt;br&gt;
    'database' =&amp;gt; env('DB_DATABASE'),&lt;br&gt;
    'username' =&amp;gt; env('DB_USERNAME'),&lt;br&gt;
    'password' =&amp;gt; env('DB_PASSWORD'),&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Connection Pool Settings
'options' =&amp;gt; [
    PDO::ATTR_PERSISTENT         =&amp;gt; true,  // Persistent Connection
    PDO::ATTR_EMULATE_PREPARES   =&amp;gt; false,
    PDO::MYSQL_ATTR_INIT_COMMAND =&amp;gt; "SET time_zone='+06:00'", // Bangladesh
],
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;],&lt;/p&gt;

&lt;p&gt;// PgBouncer — PostgreSQL Connection Pooler&lt;br&gt;
// docker-compose.yml এ যোগ করুন:&lt;br&gt;
//&lt;br&gt;
// pgbouncer:&lt;br&gt;
//   image: edoburu/pgbouncer&lt;br&gt;
//   environment:&lt;br&gt;
//     DB_HOST: postgres&lt;br&gt;
//     DB_PORT: 5432&lt;br&gt;
//     MAX_CLIENT_CONN: 1000      # সর্বোচ্চ Client&lt;br&gt;
//     DEFAULT_POOL_SIZE: 20      # প্রতি DB ২০ Connection&lt;br&gt;
//     POOL_MODE: transaction     # Transaction Level Pooling&lt;br&gt;
//   ports:&lt;br&gt;
//     - "5432:5432"&lt;/p&gt;

&lt;p&gt;// app/Services/ConnectionPoolMonitor.php&lt;br&gt;
class ConnectionPoolMonitor&lt;br&gt;
{&lt;br&gt;
    public function getStats(): array&lt;br&gt;
    {&lt;br&gt;
        // Active Connections দেখুন&lt;br&gt;
        $connections = DB::select("&lt;br&gt;
            SELECT&lt;br&gt;
                count(*) as total,&lt;br&gt;
                sum(case when command = 'Sleep' then 1 else 0 end) as idle,&lt;br&gt;
                sum(case when command != 'Sleep' then 1 else 0 end) as active,&lt;br&gt;
                max(time) as max_query_time&lt;br&gt;
            FROM information_schema.processlist&lt;br&gt;
            WHERE user = ?&lt;br&gt;
        ", [config('database.connections.mysql.username')]);&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    return [
        'total_connections' =&amp;gt; $connections[0]-&amp;gt;total,
        'idle_connections'  =&amp;gt; $connections[0]-&amp;gt;idle,
        'active_connections'=&amp;gt; $connections[0]-&amp;gt;active,
        'max_query_time_s'  =&amp;gt; $connections[0]-&amp;gt;max_query_time,
        'pool_usage_pct'    =&amp;gt; round(
            $connections[0]-&amp;gt;active / max($connections[0]-&amp;gt;total, 1) * 100,
            1
        ),
    ];
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🔬 **PART 6 — Performance Testing**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
nginx&lt;br&gt;
php&lt;br&gt;
// tests/Performance/ApiPerformanceTest.php&lt;br&gt;
class ApiPerformanceTest extends TestCase&lt;br&gt;
{&lt;br&gt;
    /** &lt;a class="mentioned-user" href="https://dev.to/test"&gt;@test&lt;/a&gt; */&lt;br&gt;
    public function product_list_api_responds_within_200ms(): void&lt;br&gt;
    {&lt;br&gt;
        // Seed করুন&lt;br&gt;
        Product::factory()-&amp;gt;count(100)-&amp;gt;create();&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    $start = microtime(true);

    $response = $this-&amp;gt;getJson('/api/v1/products');

    $duration = (microtime(true) - $start) * 1000;

    $response-&amp;gt;assertOk();

    $this-&amp;gt;assertLessThan(
        200,
        $duration,
        "Product List API {$duration}ms নিয়েছে। ২০০ms এর মধ্যে হওয়া উচিত।"
    );
}

/** @test */
public function no_n_plus_one_query_on_product_list(): void
{
    Product::factory()-&amp;gt;count(20)-&amp;gt;create();

    // Query Count Check করুন
    DB::enableQueryLog();

    $this-&amp;gt;getJson('/api/v1/products');

    $queryCount = count(DB::getQueryLog());
    DB::disableQueryLog();

    // ৫টার বেশি Query হওয়া উচিত না
    $this-&amp;gt;assertLessThanOrEqual(
        5,
        $queryCount,
        "Product List এ {$queryCount} টা Query চললো। N+1 সমস্যা আছে!"
    );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
plaintext&lt;br&gt;
bash&lt;/p&gt;
&lt;h1&gt;
  
  
  Apache Bench — Simple Load Test
&lt;/h1&gt;

&lt;p&gt;ab -n 1000 -c 100 \&lt;br&gt;
   -H "Authorization: Bearer TOKEN" \&lt;br&gt;
   &lt;a href="https://myapp.com/api/v1/products" rel="noopener noreferrer"&gt;https://myapp.com/api/v1/products&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Output:
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Requests per second: 450 [#/sec]
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Time per request: 222 &lt;a href="https://dev.tomean"&gt;ms&lt;/a&gt;
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Failed requests: 0
&lt;/h1&gt;
&lt;h1&gt;
  
  
  k6 — Advanced Load Testing
&lt;/h1&gt;
&lt;h1&gt;
  
  
  k6/load-test.js
&lt;/h1&gt;

&lt;p&gt;import http from 'k6/http';&lt;br&gt;
import { check, sleep } from 'k6';&lt;/p&gt;

&lt;p&gt;export let options = {&lt;br&gt;
    stages: [&lt;br&gt;
        { duration: '2m', target: 100 },   // Ramp up&lt;br&gt;
        { duration: '5m', target: 100 },   // Stay&lt;br&gt;
        { duration: '2m', target: 200 },   // Spike&lt;br&gt;
        { duration: '5m', target: 200 },   // Stay&lt;br&gt;
        { duration: '2m', target: 0   },   // Ramp down&lt;br&gt;
    ],&lt;br&gt;
    thresholds: {&lt;br&gt;
        http_req_duration: ['p(95)&amp;lt;500'],  // ৯৫% Request ৫০০ms এর মধ্যে&lt;br&gt;
        http_req_failed: ['rate&amp;lt;0.01'],    // ১% এর কম Error&lt;br&gt;
    },&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;export default function () {&lt;br&gt;
    let response = http.get('&lt;a href="https://myapp.com/api/v1/products" rel="noopener noreferrer"&gt;https://myapp.com/api/v1/products&lt;/a&gt;', {&lt;br&gt;
        headers: { Authorization: 'Bearer TOKEN' }&lt;br&gt;
    });&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;check(response, {
    'status is 200':          (r) =&amp;gt; r.status === 200,
    'response time &amp;lt; 500ms':  (r) =&amp;gt; r.timings.duration &amp;lt; 500,
    'has data':               (r) =&amp;gt; JSON.parse(r.body).data.length &amp;gt; 0,
});

sleep(1);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;// চালান:&lt;br&gt;
// k6 run k6/load-test.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
---

📋 **PART 7 — Performance Checklist**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
php&lt;br&gt;
php&lt;br&gt;
// app/Console/Commands/PerformanceAudit.php&lt;br&gt;
class PerformanceAudit extends Command&lt;br&gt;
{&lt;br&gt;
    protected $signature   = 'app:performance-audit';&lt;br&gt;
    protected $description = 'Performance সমস্যা খুঁজুন';&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function handle(): void
{
    $this-&amp;gt;info('🔍 Performance Audit শুরু হচ্ছে...');
    $issues = [];

    // ১. Cache Check
    if (!config('cache.default') === 'redis') {
        $issues[] = '⚠️ Redis Cache ব্যবহার করুন';
    }

    // ২. Queue Check
    if (config('queue.default') === 'sync') {
        $issues[] = '⚠️ Sync Queue Production এ ব্যবহার করবেন না';
    }

    // ৩. Debug Mode Check
    if (config('app.debug')) {
        $issues[] = '❌ APP_DEBUG=true Production এ বিপজ্জনক!';
    }

    // ৪. Slow Query Check
    $slowQueries = DB::select("
        SELECT query_time, sql_text
        FROM mysql.slow_log
        WHERE query_time &amp;gt; 1
        ORDER BY query_time DESC
        LIMIT 10
    ");

    if (!empty($slowQueries)) {
        $issues[] = '⚠️ ' . count($slowQueries) . 'টা Slow Query পাওয়া গেছে';
    }

    // ৫. Missing Index Check
    $missingIndexes = DB::select("
        SELECT table_name, column_name
        FROM information_schema.columns
        WHERE table_schema = ?
        AND column_name LIKE '%_id'
        AND column_name NOT IN (
            SELECT column_name
            FROM information_schema.statistics
            WHERE table_schema = ?
        )
    ", [config('database.connections.mysql.database'),
        config('database.connections.mysql.database')]);

    if (!empty($missingIndexes)) {
        $issues[] = '⚠️ ' . count($missingIndexes) . 'টা Foreign Key এ Index নেই';
    }

    // Result
    if (empty($issues)) {
        $this-&amp;gt;info('✅ কোনো সমস্যা পাওয়া যায়নি!');
    } else {
        $this-&amp;gt;error('❌ ' . count($issues) . 'টা সমস্যা পাওয়া গেছে:');
        foreach ($issues as $issue) {
            $this-&amp;gt;line("  {$issue}");
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
// চালান: php artisan app:performance-audit&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

📝 **সংক্ষেপে মনে রাখুন**
**Profiling আগে, Optimize পরে** — অনুমান না করে আগে Profile করুন, সমস্যা খুঁজুন, তারপর Fix করুন।
**Database** — N+1 Query সবচেয়ে Common সমস্যা। Eager Loading, Index, এবং Select Specific Columns ব্যবহার করুন।

**Cache** — Multi-level Cache ব্যবহার করুন। Local Array → Redis → Database এই ক্রমে।

**Load Balancing** — Nginx বা HAProxy দিয়ে Traffic ভাগ করুন। Least Connection Algorithm বেশিরভাগ ক্ষেত্রে ভালো।

**Testing** — Performance Test CI/CD এ যোগ করুন — যাতে Regression ধরা পড়ে।

**Laravel Specific** — `php artisan optimize` Deploy এ চালান, OPcache Enable করুন, Queue Worker আলাদা রাখুন।
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>architecture</category>
      <category>backend</category>
      <category>microservices</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Laravel Reverb &amp; Echo — Interview Q&amp;A</title>
      <dc:creator>Ruhul Amin Sujon</dc:creator>
      <pubDate>Sat, 07 Mar 2026 20:10:55 +0000</pubDate>
      <link>https://dev.to/ruhul_aminsujon_f65b3678/laravel-reverb-echo-interview-qa-5bda</link>
      <guid>https://dev.to/ruhul_aminsujon_f65b3678/laravel-reverb-echo-interview-qa-5bda</guid>
      <description>&lt;p&gt;1️⃣ &lt;strong&gt;WebSocket কী? HTTP থেকে কীভাবে আলাদা?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;সহজ উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;কল্পনা করো তুমি তোমার বন্ধুকে চিঠি পাঠাচ্ছো।&lt;br&gt;
&lt;strong&gt;HTTP&lt;/strong&gt; হলো চিঠির মতো:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;তুমি → চিঠি পাঠালে → বন্ধু পড়লো → জবাব দিলো → শেষ
(প্রতিবার নতুন চিঠি = নতুন connection)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;WebSocket&lt;/strong&gt; হলো ফোন কলের মতো:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;তুমি → ফোন করলে → লাইন খোলা রইলো → যেকোনো সময় কথা বলো
(একবার connect = সবসময় connected)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;HTTP&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser  →→→ Request →→→  Server
Browser  ←←← Response ←←← Server
(connection বন্ধ!)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;WebSocket&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser  ←——————————————→  Server
         (সবসময় open থাকে)
         যেকোনো সময় data
         দুইদিক থেকেই যেতে পারে
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2️⃣ &lt;strong&gt;Laravel Reverb কী? Pusher থেকে কীভাবে আলাদা?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;সহজ উত্তর&lt;/strong&gt;:&lt;br&gt;
&lt;strong&gt;Pusher&lt;/strong&gt; হলো ভাড়া করা ফোন সার্ভিসের মতো — তুমি টাকা দাও, তারা সব manage করে।&lt;br&gt;
&lt;strong&gt;Reverb&lt;/strong&gt; হলো নিজের ফোন টাওয়ার বানানোর মতো — তোমার VPS-এ নিজেই চলে, কাউকে টাকা দিতে হয় না।&lt;br&gt;
&lt;strong&gt;Pusher&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;তোমার App → Pusher এর Server (বাইরে) → User
            (মাসে টাকা লাগে 💰)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Reverb&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;তোমার App → তোমার নিজের Server → User
            (একদম ফ্রি! 🎉)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Reverb install করা
composer require laravel/reverb
php artisan reverb:install

# চালানো
php artisan reverb:start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3️⃣ &lt;strong&gt;Laravel Echo কী?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;সহজ উত্তর&lt;/strong&gt;:&lt;br&gt;
Echo হলো তোমার কানের মতো 👂&lt;br&gt;
Reverb Server কথা বলে — Echo সেটা শোনে এবং তোমার browser-এ দেখায়।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;javascript
// Echo ছাড়া (কঠিন):
const socket = new WebSocket('ws://localhost:8080');
socket.onmessage = function(event) {
    const data = JSON.parse(event.data);
    if(data.event === 'MessageSent') {
        // কাজ করো
    }
};

// Echo দিয়ে (সহজ):
Echo.private('chat.1')
    .listen('MessageSent', (e) =&amp;gt; {
        // সরাসরি কাজ করো! Echo বাকি সব handle করে
    });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Echo আসলে ভেতরে ভেতরে WebSocket connection তৈরি করে, channel subscribe করে, event শোনে — তুমি শুধু &lt;code&gt;.listen()&lt;/code&gt; লিখলেই হয়।&lt;/p&gt;




&lt;h2&gt;
  
  
  4️⃣ &lt;strong&gt;Channel কত প্রকার ও কী কী?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;সহজ উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Channel হলো TV channel-এর মতো। কিছু channel সবাই দেখতে পারে, কিছু channel শুধু subscriber রা।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Public Channel  → যে কেউ দেখতে পারে (খোলা মাঠের মতো)
Private Channel → শুধু logged-in user দেখতে পারে (বাড়ির ভেতরের মতো)
Presence Channel → কে কে online আছে সেটাও জানা যায় (হাজিরা খাতার মতো)
javascript// Public — যে কেউ
Echo.channel('admin-orders')
    .listen('OrderCreated', (e) =&amp;gt; { });

// Private — শুধু authenticated user
Echo.private('chat.1')        // chat.{conversation_id}
    .listen('MessageSent', (e) =&amp;gt; { });

// Private — শুধু নিজের orders দেখবে
Echo.private('orders.5')      // orders.{user_id}
    .listen('OrderStatusUpdated', (e) =&amp;gt; { });
php// channels.php — Private channel এর permission check
Broadcast::channel('chat.{userId}', function ($user, $userId) {
    // এই user কি এই channel দেখার অনুমতি রাখে?
    return (int) $user-&amp;gt;id === (int) $userId;
    // true হলে দেখতে পাবে, false হলে পাবে না
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5️⃣ &lt;strong&gt;ShouldBroadcast Interface কী করে?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;সহজ উত্তর&lt;/strong&gt;:&lt;br&gt;
&lt;code&gt;ShouldBroadcast&lt;/code&gt; হলো একটা চিহ্নের মতো 🏷️ যেটা Laravel-কে বলে — "এই Event টা শুধু PHP-তে রাখো না, WebSocket দিয়ে browser-এও পাঠাও!"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php
// ShouldBroadcast ছাড়া:
class OrderStatusUpdated  // শুধু PHP জানবে, browser জানবে না
{
    // ...
}

// ShouldBroadcast দিয়ে:
class OrderStatusUpdated implements ShouldBroadcast  // browser-ও জানবে!
{
    // ...
}
php&amp;lt;?php

namespace App\Events;

use App\Models\Orderdetail;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;  // ← এই interface
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\InteractsWithSockets;

class OrderStatusUpdated implements ShouldBroadcast
{
    use Dispatchable;        // broadcast() helper use করতে দেয়
    use InteractsWithSockets; // WebSocket এর সাথে কাজ করতে দেয়
    use SerializesModels;    // Model কে Queue এ safe রাখে

    public Orderdetail $order; // ← public মানে broadcast হবে

    public function __construct(Orderdetail $order)
    {
        $this-&amp;gt;order = $order; // order save করো
    }

    public function broadcastOn(): array
    {
        // কোন channel এ পাঠাবো?
        return [
            new PrivateChannel('orders.' . $this-&amp;gt;order-&amp;gt;user_id)
        ];
    }

    public function broadcastWith(): array
    {
        // কী data পাঠাবো?
        return [
            'order_id' =&amp;gt; $this-&amp;gt;order-&amp;gt;id,
            'status'   =&amp;gt; $this-&amp;gt;order-&amp;gt;status,
        ];
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6️⃣ &lt;code&gt;broadcast()&lt;/code&gt; vs &lt;code&gt;event()&lt;/code&gt; — &lt;strong&gt;পার্থক্য কী?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;সহজ উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;event()&lt;/strong&gt;     → শুধু PHP এর ভেতরে কাজ করে (চিৎকার করো, শুধু ঘরের লোক শুনবে)&lt;br&gt;
&lt;strong&gt;broadcast()&lt;/strong&gt; → PHP + WebSocket দিয়ে browser-এও যায় (মাইকে বলো, সবাই শুনবে)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php
// শুধু PHP listeners notify করবে:
event(new OrderStatusUpdated($order));

// PHP + Browser দুটোই notify করবে:
broadcast(new OrderStatusUpdated($order));

// Browser notify করবে কিন্তু যে request করেছে তাকে বাদ দিবে:
broadcast(new OrderStatusUpdated($order))-&amp;gt;toOthers();
// (নিজের screen এ duplicate দেখা বন্ধ করতে)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7️⃣ &lt;code&gt;SerializesModels&lt;/code&gt; &lt;strong&gt;Trait কী করে? Bug কেন হয়েছিল?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;সহজ উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Queue হলো একটা লাইনের মতো 🚶‍♂️🚶‍♂️🚶‍♂️ — কাজগুলো একের পর এক হয়।&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SerializesModels&lt;/code&gt; &lt;code&gt;Queue-এ Model save করার সময় পুরো Model না রেখে শুধু **ID** রাখে। পরে কাজ করার সময় সেই ID দিয়ে DB থেকে আবার আনে।&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Bug হওয়ার কারণ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public $order;              // ← Type নেই!
__construct($order)         // ← Type নেই!

Queue এ গেলো: {id: 5}     // শুধু ID save হলো
Queue থেকে আসলো: ModelIdentifier{id: 5}  // Model না, শুধু identifier object!
$this-&amp;gt;order-&amp;gt;user_id      // ❌ ERROR! user_id নেই এই object এ

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public Orderdetail $order;           // ← Type দিলাম!
__construct(Orderdetail $order)      // ← Type দিলাম!

Queue এ গেলো: {id: 5, class: Orderdetail}
Queue থেকে আসলো: Orderdetail{id:5, user_id:3, status:'Pending'}  // ✅ পুরো Model!
$this-&amp;gt;order-&amp;gt;user_id      // ✅ কাজ করছে!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;8️⃣ &lt;strong&gt;Queue কেন দরকার? Broadcast সরাসরি করলে কী হয়?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;সহজ উত্তর&lt;/strong&gt;:&lt;br&gt;
কল্পনা করো তোমার দোকানে ১০০ জন কাস্টমার একসাথে এলো।&lt;br&gt;
&lt;strong&gt;Queue ছাড়া&lt;/strong&gt;: তুমি একা সবাইকে একসাথে serve করতে গেলে — সব ভেঙে পড়বে! 😵&lt;br&gt;
&lt;strong&gt;Queue দিয়ে&lt;/strong&gt;: একটা লাইন তৈরি হবে, একে একে serve হবে — smooth! ✅&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php
// Queue ছাড়া broadcast (synchronous):
// User request করলো → broadcast হলো → তারপর response গেলো
// যদি broadcast slow হয় → user অপেক্ষা করবে!

// Queue দিয়ে broadcast (asynchronous):
// User request করলো → response গেলো (fast!) → background এ broadcast হলো
class OrderStatusUpdated implements ShouldBroadcast
{
    // ShouldBroadcast automatically queue use করে
    // .env এ QUEUE_CONNECTION=redis থাকলে Redis queue এ যাবে
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bash
# Queue worker চালাতে হবে (background এ কাজ করে)
php artisan queue:work redis

# VPS এ Supervisor দিয়ে সবসময় চালু রাখো
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  9️⃣ &lt;strong&gt;Private Channel এ Authentication কীভাবে কাজ করে?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;সহজ উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Private channel হলো তালা দেওয়া ঘরের মতো 🔒। ঢুকতে হলে চাবি লাগবে।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User browser এ Echo.private('chat.5') লিখলো
        ↓
Echo automatically POST /broadcasting/auth করলো
        ↓
Laravel check করলো — এই user কি chat.5 channel এ ঢুকতে পারবে?
        ↓
channels.php এর callback চললো
        ↓
true → ঢুকতে পারবে ✅  |  false → ঢুকতে পারবে না ❌
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php
// routes/channels.php
Broadcast::channel('chat.{userId}', function ($user, $userId) {
    // $user = currently logged in user
    // $userId = channel name এর {userId} part

    // admin সব channel দেখতে পারবে
    // user শুধু নিজেরটা দেখতে পারবে
    return $user-&amp;gt;role === 'admin' || (int) $user-&amp;gt;id === (int) $userId;
});
php
// bootstrap/app.php এ broadcasting auth route enable করতে হবে
-&amp;gt;withRouting(
    channels: __DIR__.'/../routes/channels.php', // ← এটা থাকতে হবে
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔟 &lt;code&gt;broadcastOn()&lt;/code&gt; vs &lt;code&gt;broadcastWith()&lt;/code&gt; vs &lt;code&gt;broadcastAs()&lt;/code&gt; — &lt;strong&gt;পার্থক্য কী?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;সহজ উত্তর:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;broadcastOn()   → কোথায় পাঠাবো? (Channel এর নাম)
broadcastWith() → কী পাঠাবো? (Data)
broadcastAs()   → কী নামে পাঠাবো? (Event এর নাম)
phpclass MessageSent implements ShouldBroadcast
{
    public function broadcastOn(): array
    {
        // 📍 কোথায় পাঠাবো?
        return [new PrivateChannel('chat.' . $this-&amp;gt;message-&amp;gt;conversation_id)];
    }

    public function broadcastWith(): array
    {
        // 📦 কী data পাঠাবো?
        return [
            'id'        =&amp;gt; $this-&amp;gt;message-&amp;gt;id,
            'message'   =&amp;gt; $this-&amp;gt;message-&amp;gt;message,
            'sender_id' =&amp;gt; $this-&amp;gt;message-&amp;gt;sender_id,
            'time'      =&amp;gt; $this-&amp;gt;message-&amp;gt;created_at-&amp;gt;format('h:i A'),
        ];
        // শুধু দরকারি data পাঠাও — পুরো Model না
        // কারণ পুরো Model পাঠালে sensitive data যেতে পারে
    }

    public function broadcastAs(): string
    {
        // 🏷️ কী নামে পাঠাবো?
        return 'MessageSent';
        // frontend এ .listen('MessageSent') দিয়ে শুনবো
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;1️⃣1️⃣ &lt;code&gt;.toOthers()&lt;/code&gt; কী করে? কখন দরকার?&lt;br&gt;
&lt;strong&gt;সহজ উত্তর&lt;/strong&gt;:&lt;br&gt;
তুমি WhatsApp-এ message পাঠালে — তোমার নিজের screen-এ কি message আবার আসে? না! শুধু অন্যজনের কাছে যায়।&lt;br&gt;
&lt;code&gt;.toOthers()&lt;/code&gt; ঠিক সেটাই করে।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php
// toOthers() ছাড়া:
broadcast(new MessageSent($message));
// সবাই পাবে — message পাঠানো user নিজেও পাবে
// ফলে message দুইবার দেখাবে! (একবার JS appendMessage থেকে, একবার Echo থেকে)

// toOthers() দিয়ে:
broadcast(new MessageSent($message))-&amp;gt;toOthers();
// message পাঠানো user বাদে বাকি সবাই পাবে ✅
javascript
// Frontend এ নিজের message নিজে append করো:
axios.post('/send', {message: msg})
    .then(res =&amp;gt; {
        appendMessage(res.data, true); // নিজে append করলাম
    });

// Echo থেকে শুধু অন্যজনের message নাও:
Echo.private('chat.1')
    .listen('MessageSent', (e) =&amp;gt; {
        // toOthers() থাকায় নিজের message এখানে আসবে না
        appendMessage(e.message, false);
    });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  1️⃣2️⃣ &lt;strong&gt;Redis Queue কীভাবে কাজ করে?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;সহজ উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Redis Queue হলো একটা &lt;strong&gt;To-Do List&lt;/strong&gt; এর মতো 📝&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;কাজ আসলো → List এ লিখলো → Worker এসে পড়লো → কাজ করলো → List থেকে কাটলো

broadcast() call হলো
        ↓
Redis এ job save হলো (list এ ঢুকলো)
        ↓
queue:work worker সেটা দেখলো
        ↓
WebSocket এ data পাঠালো
        ↓
Job শেষ (list থেকে কাটলো) ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bash
# Redis এ কী আছে দেখো
redis-cli
&amp;gt; KEYS *           # সব keys দেখো
&amp;gt; LLEN queues:default  # queue তে কতটা job আছে
env# .env
QUEUE_CONNECTION=redis   # ← Redis use করবে
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;1️⃣3️⃣ &lt;strong&gt;Ajax দুইবার call হওয়ার কারণ কী ছিল?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;সহজ উত্তর&lt;/strong&gt;:&lt;br&gt;
কল্পনা করো তুমি doorbell বাজালে — কিন্তু doorbell এ দুটো বোতাম আছে, দুটোই same কাজ করে। তুমি একটা বাজালেও দুইটাই বাজলো!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;javascript
// সমস্যা ছিল:
// ১. Form এর submit event
// ২. Button এর type="submit" — এটাও form submit করে
// = দুইবার submit!

// আরেকটা কারণ:
// @push('scripts') যদি দুইবার load হয়
// তাহলে addEventListener দুইবার attach হয়
// = দুইবার call!
javascript
// Fix:
const form = document.getElementById('chat-form');

// পুরনো সব listener মুছে ফেলো (clone করে)
const freshForm = form.cloneNode(true);
form.parentNode.replaceChild(freshForm, form);

freshForm.addEventListener('submit', function(e) {
    e.preventDefault();      // form submit বন্ধ করো
    e.stopPropagation();     // event bubble বন্ধ করো

    if (sending) return;     // already sending হলে আর করো না
    sending = true;          // flag set করো

    // ... axios call
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  1️⃣4️⃣ &lt;strong&gt;Supervisor কী? VPS-এ কেন দরকার?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;সহজ উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Supervisor হলো একজন &lt;strong&gt;Manager&lt;/strong&gt; এর মতো 👨‍💼&lt;/p&gt;

&lt;p&gt;তুমি যদি &lt;code&gt;php artisan queue:work&lt;/code&gt; manually চালাও — CMD বন্ধ করলেই সব বন্ধ। কিন্তু Manager (Supervisor) সবসময় দেখছে — কিছু বন্ধ হলে আবার চালু করে দেয়।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;তুমি ঘুমাও 😴
        ↓
queue:work crash করলো!
        ↓
Supervisor দেখলো — "আরে বন্ধ হয়ে গেছে!"
        ↓
Supervisor আবার চালু করলো ✅
        ↓
তুমি জানোও না কিছু হয়েছিল
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ini; 
/etc/supervisor/conf.d/reverb.conf
[program:reverb]
command=php /var/www/project/artisan reverb:start
autostart=true    ; server start হলে automatically চালু হবে
autorestart=true  ; crash করলে automatically restart হবে
user=www-data

; /etc/supervisor/conf.d/queue.conf
[program:queue]
command=php /var/www/project/artisan queue:work redis
autostart=true
autorestart=true
numprocs=2        ; দুটো worker একসাথে চলবে
user=www-data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  1️⃣5️⃣ &lt;code&gt;ShouldBroadcastNow&lt;/code&gt; vs &lt;code&gt;ShouldBroadcast&lt;/code&gt; — &lt;strong&gt;পার্থক্য কী?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;সহজ উত্তর:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ShouldBroadcast     → Queue এ যাবে, একটু পরে পাঠাবে (ডাকযোগে চিঠি)
ShouldBroadcastNow  → Queue bypass করে এখনই পাঠাবে (হাতে হাতে চিঠি)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php
// Queue এ যাবে (recommended for production):
class MessageSent implements ShouldBroadcast { }

// এখনই যাবে, Queue bypass (development/testing এ ভালো):
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
class MessageSent implements ShouldBroadcastNow { }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;কখন কোনটা?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ShouldBroadcast&lt;/strong&gt;:&lt;br&gt;
✅ Production এ (&lt;strong&gt;VPS&lt;/strong&gt;)&lt;br&gt;
✅ অনেক user থাকলে&lt;br&gt;
✅ Server load কমাতে&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ShouldBroadcastNow&lt;/strong&gt;:&lt;br&gt;
✅ Development এ test করতে&lt;br&gt;
✅ queue:work চালু না থাকলে&lt;br&gt;
✅ Critical notification (এখনই দরকার)&lt;/p&gt;


&lt;h2&gt;
  
  
  1️⃣6️⃣ &lt;strong&gt;Unread Message Count কীভাবে কাজ করে?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;সহজ উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;এটা হলো তোমার WhatsApp-এর লাল badge এর মতো 🔴&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;নতুন message আসলো
        ↓
Echo .listen() এ ধরা পড়লো
        ↓
JavaScript counter++ করলো
        ↓
Badge এ number দেখালো
        ↓
User click করলো → counter = 0 → badge লুকালো
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;javascript

let unreadCount = 0;

Echo.private('chat.' + conversationId)
    .listen('MessageSent', (e) =&amp;gt; {

        // নিজের message হলে ignore করো
        if (e.message.sender_id === {{ auth()-&amp;gt;id() }}) return;

        // Message দেখাও
        appendMessage(e.message, false);

        // Sound বাজাও
        document.getElementById('chatSound').play();

        // Count বাড়াও
        unreadCount++;
        let badge = document.getElementById('unread-badge');
        badge.innerText = unreadCount;
        badge.classList.remove('d-none'); // দেখাও
    });

// User chat খুললে reset করো
function resetUnreadCount() {
    unreadCount = 0;
    document.getElementById('unread-badge').classList.add('d-none'); // লুকাও
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php
// DB তেও unread count রাখো (page refresh এর পরেও থাকবে)
// messages table এ is_read column
Message::where('conversation_id', $id)
       -&amp;gt;where('sender_id', '!=', auth()-&amp;gt;id())
       -&amp;gt;where('is_read', false)
       -&amp;gt;update(['is_read' =&amp;gt; true]);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;1️⃣7️⃣ &lt;code&gt;.env&lt;/code&gt; &lt;strong&gt;এ Reverb Config কী মানে?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;সহজ উত্তর&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;env
# Reverb কোন address এ চলবে?
REVERB_HOST=0.0.0.0      # সব network থেকে connection নেবে
                          # (127.0.0.1 হলে শুধু local থেকে নিতো)

REVERB_PORT=8080          # কোন port এ শুনবে?
                          # (80 হলো HTTP, 443 হলো HTTPS, 8080 হলো custom)

REVERB_SCHEME=https       # http নাকি https?
                          # Production এ সবসময় https

# Frontend (JavaScript) কোথায় connect করবে?
VITE_REVERB_APP_KEY="${REVERB_APP_KEY}"   # চাবি — match করতে হবে
VITE_REVERB_HOST="${APP_URL}"             # কোথায় connect করবে
VITE_REVERB_PORT="${REVERB_PORT}"         # কোন port এ
VITE_REVERB_SCHEME="${REVERB_SCHEME}"     # http/https
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;javascript
// bootstrap.js এ এই config use হয়:
window.Echo = new Echo({
    broadcaster: 'reverb',
    key: import.meta.env.VITE_REVERB_APP_KEY,    // .env থেকে আসে
    wsHost: import.meta.env.VITE_REVERB_HOST,    // .env থেকে আসে
    wsPort: import.meta.env.VITE_REVERB_PORT,    // .env থেকে আসে
    forceTLS: true,  // https use করবে
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  1️⃣8️⃣ &lt;code&gt;Nginx&lt;/code&gt; &lt;strong&gt;দিয়ে Reverb Proxy কেন দরকার?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;সহজ উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;তোমার বাড়িতে একটাই দরজা (port 443/HTTPS)। কিন্তু ভেতরে দুটো ঘর আছে — একটা website (Laravel), একটা WebSocket (Reverb)।&lt;/p&gt;

&lt;p&gt;Nginx হলো দারোয়ানের মতো 💂 — কে কোন ঘরে যাবে সেটা দেখে।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User এর browser
        ↓
https://yourdomain.com (port 443)
        ↓
    Nginx (দারোয়ান)
    /        → Laravel (website)
    /app      → Reverb (WebSocket)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nginx
# Normal website traffic → Laravel
location / {
    try_files $uri $uri/ /index.php?$query_string;
}

# WebSocket traffic → Reverb
location /app {
    proxy_pass http://127.0.0.1:8080;  # Reverb এ পাঠাও
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;      # WebSocket upgrade
    proxy_set_header Connection "Upgrade";       # WebSocket upgrade
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  1️⃣9️⃣ Real-time Order Status কীভাবে কাজ করে — &lt;strong&gt;পুরো flow&lt;/strong&gt;?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;সহজ উত্তর:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Admin order status change করলো
            ↓
OrderController → orderStatusUpdate()
            ↓
DB তে status save হলো
            ↓
broadcast(new OrderStatusUpdated($order))
            ↓
Redis Queue তে job গেলো
            ↓
queue:work worker job নিলো
            ↓
Reverb WebSocket server এ পাঠালো
            ↓
User এর browser Echo.private('orders.5') শুনছিলো
            ↓
.listen('OrderStatusUpdated') এ ধরা পড়লো
            ↓
JavaScript DOM update করলো (page refresh ছাড়া!) ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;javascript
// User এর order page এ:
Echo.private('orders.{{ auth()-&amp;gt;id() }}')
    .listen('.OrderStatusUpdated', (e) =&amp;gt; {

        // Status badge update করো
        let badge = document.querySelector('#order-' + e.order_id + ' .status-badge');
        if (badge) {
            badge.textContent = e.status;
            // পুরনো class সরাও, নতুন class দাও
            badge.className = 'badge status-' + e.status.toLowerCase();
        }

        // Toast notification দেখাও
        alert('তোমার অর্ডার আপডেট হয়েছে: ' + e.status);
    });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2️⃣0️⃣ &lt;strong&gt;Production এ কী কী Check করতে হবে?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;সহজ উত্তর&lt;/strong&gt;:&lt;br&gt;
বাড়ি বানানো শেষ — এখন চেক করো সব ঠিক আছে কিনা 🏠&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bash
# ১. Reverb চলছে কিনা দেখো
sudo supervisorctl status glamours-reverb
# RUNNING দেখালে ✅

# ২. Queue worker চলছে কিনা দেখো
sudo supervisorctl status glamours-queue
# RUNNING দেখালে ✅

# ৩. Redis চলছে কিনা দেখো
redis-cli ping
# PONG দেখালে ✅

# ৪. WebSocket connection test করো
# Browser Console এ:
# Echo.connector.pusher.connection.state
# "connected" দেখালে ✅

# ৫. Laravel Config cache করো
php artisan config:cache
php artisan route:cache
php artisan event:cache

# ৬. Failed jobs আছে কিনা দেখো
php artisan queue:failed
# কিছু না দেখালে ✅

# ৭. Log দেখো
tail -f storage/logs/laravel.log
# Error না দেখালে ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Production Checklist:
[ ] APP_DEBUG=false
[ ] APP_ENV=production
[ ] QUEUE_CONNECTION=redis
[ ] BROADCAST_CONNECTION=reverb
[ ] Supervisor running (reverb + queue)
[ ] SSL certificate valid (https)
[ ] Nginx proxy configured
[ ] Redis running
[ ] Storage link created
[ ] Config cached
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎯 Quick Summary — একনজরে
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WebSocket    = সবসময় open ফোন লাইন
Reverb       = নিজের WebSocket server (ফ্রি!)
Echo         = Browser এ WebSocket শোনার কান
Channel      = TV channel (Public/Private)
ShouldBroadcast = "Browser কেও জানাও" চিহ্ন
broadcast()  = সবাইকে বলো
toOthers()   = নিজে বাদে সবাইকে বলো
Queue        = কাজের লাইন (background এ)
Redis        = দ্রুত Queue storage
Supervisor   = সবসময় চালু রাখার Manager
SerializesModels = Queue এ Model safe রাখে (Type hint দিতে হবে!)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;Q_21&lt;/em&gt;&lt;/strong&gt;: which network use Reverb? https network vs Reverb network? explain like as i am 6 years oldMar 6HTTPS vs Reverb Network&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;🏠 একটা গল্প দিয়ে শুরু করি&lt;br&gt;
কল্পনা করো তোমার বাড়িতে &lt;strong&gt;দুই ধরনের যোগাযোগ&lt;/strong&gt; আছে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;১. 📬 চিঠির বাক্স (HTTPS)
   → তুমি চিঠি পাঠাও
   → জবাব আসে
   → তারপর শেষ

২. 📞 টেলিফোন (WebSocket/Reverb)
   → একবার কল করো
   → লাইন সবসময় খোলা থাকে
   → যেকোনো সময় কথা বলো
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🌐 &lt;strong&gt;HTTPS কীভাবে কাজ করে?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;তুমি Browser এ click করলে
         ↓
Browser → "এই page টা দাও" → Server
         ↓
Server → "এই নাও page" → Browser
         ↓
    Connection বন্ধ! 🔒
    (কাজ শেষ, বিদায়!)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Real Example&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;তুমি → glamoursworld.com/products চাইলে
         ↓
HTTPS Request গেলো Port 443 দিয়ে
         ↓
Server HTML পাঠালো
         ↓
Connection বন্ধ হয়ে গেলো

পরের বার products এ কিছু add হলে?
তুমি জানবে না! কারণ connection নেই! 😢
তোমাকে আবার refresh করতে হবে।
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚡ &lt;strong&gt;WebSocket (Reverb) কীভাবে কাজ করে?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;তুমি Browser খুললে
         ↓
Browser → "আমি সবসময় connected থাকতে চাই" → Reverb Server
         ↓
Reverb → "ঠিক আছে, লাইন খোলা রাখলাম" → Browser
         ↓
    Connection সবসময় খোলা! 📞
         ↓
যেকোনো সময় Server → Browser তে data পাঠাতে পারে!
যেকোনো সময় Browser → Server তে data পাঠাতে পারে!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Real Example&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Admin order status "Shipped" করলো
         ↓
Reverb এর লাইন দিয়ে এখনই গেলো
         ↓
তোমার browser এ pop up দেখালো
         ↓
তুমি refresh করোনি, কিন্তু দেখলে! 🎉
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔌 &lt;strong&gt;কোন Port দিয়ে কোনটা চলে?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTPS  → Port 443  (সব normal website traffic)
HTTP   → Port 80   (insecure, redirect হয় 443 এ)
Reverb → Port 8080 (WebSocket traffic)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;কিন্তু তোমার user দুটো port মনে রাখবে কীভাবে?&lt;/strong&gt;&lt;br&gt;
রাখতে হবে না! &lt;strong&gt;Nginx দারোয়ান&lt;/strong&gt; সব handle করে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;glamoursworld.com      → Port 443 → Nginx → Laravel (Port 9000)
glamoursworld.com/app  → Port 443 → Nginx → Reverb  (Port 8080)

User শুধু glamoursworld.com জানলেই হলো!
Nginx বাকি সব করে। ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔍 &lt;strong&gt;Network Tab এ দেখলে কেমন দেখায়?&lt;/strong&gt;&lt;br&gt;
Browser এ &lt;strong&gt;F12&lt;/strong&gt; চাপো → &lt;strong&gt;Network tab&lt;/strong&gt; → দেখবে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTPS Requests (সাদা background):
GET  /products          200 OK   (page load)
POST /order-status      200 OK   (form submit)
GET  /api/messages      200 OK   (ajax call)
এগুলো আসে যায়, connection বন্ধ হয়।

WebSocket (হলুদ/নীল background):
WS   /app?appKey=xxx    101 Switching Protocols
↑
এটা একবার connect হয়, তারপর সবসময় open থাকে!
101 মানে "ঠিক আছে, HTTP থেকে WebSocket এ upgrade হলাম"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🏗️ &lt;strong&gt;তোমার Project এ কোনটা কীসের জন্য?&lt;/strong&gt;&lt;br&gt;
┌─────────────────────────────────────────────────────┐&lt;br&gt;
│                  glamoursworld.com                   │&lt;br&gt;
├─────────────────────┬───────────────────────────────┤&lt;br&gt;
│    HTTPS (Port 443) │   WebSocket/Reverb (Port 8080) │&lt;br&gt;
├─────────────────────┼───────────────────────────────┤&lt;br&gt;
│ Page load করা       │ Real-time chat message         │&lt;br&gt;
│ Form submit করা     │ Order status update            │&lt;br&gt;
│ Image upload করা    │ New order notification         │&lt;br&gt;
│ Login/Logout        │ Unread message count           │&lt;br&gt;
│ Product দেখা        │ Sound notification             │&lt;br&gt;
│ Order place করা     │ Admin badge count              │&lt;br&gt;
└─────────────────────┴───────────────────────────────┘&lt;/p&gt;

&lt;p&gt;📡 &lt;strong&gt;Protocol পরিবর্তন কীভাবে হয়?&lt;/strong&gt;&lt;br&gt;
শুরুতে HTTPS দিয়ে হাত মেলানো হয়:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser: "নমস্কার! আমি WebSocket connection চাই"
         GET /app HTTP/1.1
         Upgrade: websocket          ← "upgrade করতে চাই"
         Connection: Upgrade
         Sec-WebSocket-Key: abc123   ← "এই চাবি দিয়ে চিনবো"

Reverb:  "ঠিক আছে! চলো upgrade করি"
         HTTP/1.1 101 Switching Protocols  ← "101 = রাজি!"
         Upgrade: websocket
         Connection: Upgrade

এরপর থেকে:
Browser ←————— WebSocket ——————→ Reverb
        (আর HTTP না, এখন WS protocol)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔒 &lt;strong&gt;WSS vs WS — কোনটা ব্যবহার করবে?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WS  = ws://  = WebSocket (insecure, HTTP এর মতো)
WSS = wss:// = WebSocket Secure (secure, HTTPS এর মতো)

ঠিক যেমন:
HTTP  → HTTPS (তালা দেওয়া)
WS    → WSS   (তালা দেওয়া)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Production VPS এ সবসময় WSS ব্যবহার করো:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.env:
REVERB_SCHEME=https   ← এটা দিলে WSS automatically use হবে

bootstrap.js:
window.Echo = new Echo({
    forceTLS: true,   ← WSS force করো (wss://)
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎯 &lt;strong&gt;এক লাইনে Summary&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTPS  = চিঠি  📬 (পাঠাও, জবাব পাও, শেষ)
Reverb = ফোন   📞 (একবার connect, সবসময় কথা বলো)

দুটো একসাথে চলে, দুটো আলাদা কাজ করে।
তোমার project এ দুটোই দরকার! ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;Q_22&lt;/em&gt;&lt;/strong&gt;: &lt;code&gt;whisper&lt;/code&gt; &amp;amp; &lt;code&gt;listenForWhisper&lt;/code&gt; কী?&lt;br&gt;
&lt;strong&gt;Answer&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;🗣️ &lt;strong&gt;একটা গল্প দিয়ে শুরু করি&lt;/strong&gt;&lt;br&gt;
কল্পনা করো তুমি ক্লাসরুমে আছো।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;😤 জোরে কথা বলা (broadcast):
"আমি message পাঠালাম!"
→ সবাই শুনলো
→ Teacher ও শুনলো
→ Database এ লেখা হলো
→ সবাই জানলো

🤫 কানে কানে বলা (whisper):
"আমি টাইপ করছি..."
→ শুধু পাশের বন্ধু শুনলো
→ Teacher জানলো না
→ Database এ কিছু লেখা হলো না
→ এক সেকেন্ড পরে ভুলে গেলো
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;whisper&lt;/code&gt; হলো কানে কানে বলার মতো! 🤫&lt;/p&gt;




&lt;p&gt;🔍 &lt;strong&gt;Code Line by Line বোঝো&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Part 1: User টাইপ করলে whisper পাঠাও&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;javascript
// User যখন message box এ কিছু লিখতে শুরু করে
messageInput.addEventListener('input', () =&amp;gt; {
    // ← 'input' মানে keyboard এ যেকোনো key press হলে

    // কানে কানে বলো (whisper) — শুধু ওই channel এর লোক শুনবে
    Echo.private('chat.' + conversationId)
    //   ↑ এই specific conversation এর channel এ
        .whisper('typing', {
        //        ↑ event এর নাম 'typing'
            user_id: {{ auth()-&amp;gt;id() }},
            // ↑ আমি কে? (যাতে নিজের typing indicator না দেখাই)
            typing: true
            // ↑ "হ্যাঁ, আমি এখন টাইপ করছি"
        });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Part 2: ১ সেকেন্ড পরে টাইপিং বন্ধ&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;javascript    
// আগের timer বাতিল করো
    clearTimeout(typingTimer);
    // ↑ কেন? user প্রতিটা key press এ timer reset করবে
    // "a" চাপলো → 1 sec timer শুরু
    // "b" চাপলো → আগের timer বাতিল, নতুন timer শুরু
    // "c" চাপলো → আবার বাতিল, নতুন timer
    // শেষ key press এর ১ সেকেন্ড পরে চলবে ↓

    typingTimer = setTimeout(() =&amp;gt; {
    //            ↑ ১ সেকেন্ড পরে এই কাজ করো

        Echo.private('chat.' + conversationId)
            .whisper('typing', {
                user_id: {{ auth()-&amp;gt;id() }},
                typing: false
                // ↑ "আমি এখন আর টাইপ করছি না"
            });

    }, 1000);
    //  ↑ 1000 millisecond = 1 second
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Part 3: অন্যজনের typing শোনো&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;javascript
Echo.private('chat.' + conversationId)
    .listenForWhisper('typing', (e) =&amp;gt; {
    //                 ↑ 'typing' whisper আসলে এই কাজ করো

        // নিজের typing indicator দেখাবো না!
        if(e.user_id === {{ auth()-&amp;gt;id() }}) return;
        //  ↑ যদি আমি নিজেই পাঠিয়ে থাকি → ignore করো

        let indicator = document.getElementById('typing-indicator');
        // ↑ HTML এ এই element টা ধরো (যেখানে "typing..." দেখাবে)

        if(e.typing){
            indicator.style.display = 'block'; // দেখাও ✅
        }else{
            indicator.style.display = 'none';  // লুকাও ✅
        }
    });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🆚 &lt;code&gt;whisper&lt;/code&gt; vs &lt;code&gt;broadcast&lt;/code&gt; — &lt;strong&gt;পার্থক্য কী?&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    whisper          broadcast
                    ───────          ─────────
Database save?      ❌ না            ✅ হ্যাঁ
Queue use করে?      ❌ না            ✅ হ্যাঁ
Server এ যায়?       ❌ না*           ✅ হ্যাঁ
শুধু Channel এ?     ✅ হ্যাঁ         ✅ হ্যাঁ
Speed?              ⚡ অনেক দ্রুত   🐢 একটু ধীর
কাজ?               ক্ষণস্থায়ী      স্থায়ী
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;*whisper সরাসরি Reverb এর মাধ্যমে peer-to-peer যায়, Laravel server এ যায় না!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ⚡ কেন whisper ব্যবহার করলাম?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Typing indicator&lt;/code&gt; এর জন্য broadcast ব্যবহার করলে কী হতো?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User "Hello" লিখলো = 5 টা key press
         ↓
5 টা broadcast() call
         ↓
5 টা Queue job
         ↓
5 টা Database query (না হলেও server এ যেতো)
         ↓
Server এ অনেক চাপ! 😵
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Whisper ব্যবহার করলে:

User "Hello" লিখলো = 5 টা key press
         ↓
5 টা whisper (সরাসরি WebSocket এ)
         ↓
0 টা Queue job
         ↓
0 টা Database query
         ↓
Server এ কোনো চাপ নেই! 😎✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎬 Real-life Flow দেখো
&lt;/h2&gt;

&lt;p&gt;Rafi টাইপ করছে → Mim দেখছে&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rafi এর screen:               Mim এর screen:
─────────────                 ──────────────
[Hello world...]              [          ]
     ↓                             ↓
whisper('typing',{true})  →→→ listenForWhisper
     ↓                             ↓
                              "Rafi is typing..." 💬

Rafi ১ সেকেন্ড থামলো:
whisper('typing',{false}) →→→ listenForWhisper
                               typing indicator লুকালো 🙈
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎯 &lt;strong&gt;এক লাইনে Summary&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**whisper**         = কানে কানে বলা 🤫
                  (database নেই, server নেই, শুধু channel এ)

**listenForWhisper** = কান পেতে শোনা 👂
                  (whisper আসলে সাথে সাথে react করো)

**কেন দরকার?**     = Typing indicator এর মতো
                  ক্ষণস্থায়ী জিনিসের জন্য
                  যেটা save করার দরকার নেই
                  কিন্তু real-time দেখাতে হবে ✅

**_Q_23_**: websocket, পিএইচপি তে কিভাবে চেক করতে পারি? কোন নেটওয়ার্ক ব্যবহার করে? Networking  এর সাথে websocket সম্পর্ক কি?

**Answer**: 

1️⃣ **WebSocket আসলে কী?**

WebSocket হলো একটি **persistent (সবসময় খোলা)** full-duplex communication protocol।

👉 মানে:

- Client ↔ Server **একই connection এ দু’দিকেই data পাঠাতে পারে**
- HTTP এর মতো বারবার request–response লাগে না

উদাহরণ:

- Chat app
- Live notification
- Real-time dashboard
- Facebook feed update

2️⃣ **WebSocket কোন Network / Protocol ব্যবহার করে?**
🔹 **Layer অনুযায়ী দেখি (Networking view)**

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Application Layer → WebSocket (ws / wss)&lt;br&gt;
Transport Layer   → TCP&lt;br&gt;
Network Layer     → IP&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
👉 **WebSocket = TCP এর উপর তৈরি**
👉 **UDP না**, কারণ reliability দরকার

🔹 **Port ব্যবহার**

![ ](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/prj8a5pks8z4pqdbd1sd.png)



👉 `wss://` = WebSocket over TLS (HTTPS-এর মতো secure)

3️⃣ **HTTP vs WebSocket (Networking পার্থক্য)**

![ ](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0vqq7t7f3toejdgcv0ui.png)



📌 WebSocket **HTTP দিয়ে শুরু হয়**, কিন্তু পরে HTTP না থাকে।

4️⃣ **WebSocket কীভাবে শুরু হয়? (Handshake)**

👉 শুরু হয় HTTP request দিয়ে:

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GET /chat HTTP/1.1&lt;br&gt;
Host: example.com&lt;br&gt;
Upgrade: websocket&lt;br&gt;
Connection: Upgrade&lt;br&gt;
Sec-WebSocket-Key: xyz&lt;br&gt;
Sec-WebSocket-Version: 13&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Server reply দেয়:

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;HTTP/1.1 101 Switching Protocols&lt;br&gt;
Upgrade: websocket&lt;br&gt;
Connection: Upgrade&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
✔ এরপর connection পুরোপুরি WebSocket হয়ে যায়

---

5️⃣ **PHP তে WebSocket কিভাবে চেক করবো?**
✅ **Method–1: Request Header দেখে (PHP)**

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;if (&lt;br&gt;
    isset($_SERVER['HTTP_UPGRADE']) &amp;amp;&amp;amp;&lt;br&gt;
    strtolower($_SERVER['HTTP_UPGRADE']) === 'websocket'&lt;br&gt;
) {&lt;br&gt;
    echo "This is a WebSocket request";&lt;br&gt;
}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✅ **Method–2: fsockopen দিয়ে low-level check**

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;$socket = fsockopen("tcp://127.0.0.1", 6001, $errno, $errstr, 2);&lt;/p&gt;

&lt;p&gt;if ($socket) {&lt;br&gt;
    echo "WebSocket server is running";&lt;br&gt;
} else {&lt;br&gt;
    echo "WebSocket server not reachable";&lt;br&gt;
}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✅ **Method–3: Laravel WebSocket (Recommended)**

যদি Laravel ব্যবহার করো:

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;php artisan websockets:serve&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Browser console:

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;let ws = new WebSocket("ws://localhost:6001");&lt;br&gt;
ws.onopen = () =&amp;gt; console.log("Connected");&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;6️⃣ **PHP দিয়ে WebSocket Server কিভাবে বানানো হয়?**

👉 Pure PHP দিয়ে সাধারণত Ratchet ব্যবহার করা হয়।

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;composer require cboden/ratchet&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;use Ratchet\MessageComponentInterface;&lt;br&gt;
use Ratchet\ConnectionInterface;&lt;/p&gt;

&lt;p&gt;class Chat implements MessageComponentInterface {&lt;br&gt;
    public function onMessage(ConnectionInterface $conn, $msg) {&lt;br&gt;
        $conn-&amp;gt;send("Server got: $msg");&lt;br&gt;
    }&lt;br&gt;
}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
📌 Laravel এ সাধারণত:

- **Laravel WebSockets**
- **Pusher**
- **Socket.IO (Node.js backend)**

7️⃣ **Networking এর সাথে WebSocket এর সম্পর্ক কী?**

👉 সংক্ষেপে:

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;বিষয়                  সম্পর্ক&lt;br&gt;
TCP            WebSocket TCP ব্যবহার করে&lt;br&gt;
Port               80 / 443&lt;br&gt;
Firewall       HTTPS এর মতো pass করে&lt;br&gt;
Latency            কম&lt;br&gt;
Stateful       Yes&lt;br&gt;
OSI Layer      Application layer&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


👉 WebSocket হলো **Networking-এর real-time application layer protocol**

8️⃣ **Real-Life Analogy** 🧠

- HTTP = দরজায় নক (প্রতি বার knock)
- WebSocket = ফোন কল (একবার ধরলে কথা চলতেই থাকে)

---

🧠 **Interview-Ready Answer (Short)**

&amp;gt; WebSocket is a full-duplex, persistent protocol built on top of TCP.
&amp;gt; It starts with an HTTP handshake, then upgrades to ws/wss.
&amp;gt; In PHP, WebSocket requests can be detected via Upgrade headers or by running a WebSocket server like Ratchet or Laravel WebSockets.
&amp;gt; It’s tightly related to networking as it operates at the application layer over TCP/IP.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>beginners</category>
      <category>interview</category>
      <category>laravel</category>
      <category>php</category>
    </item>
    <item>
      <title>🚀 Laravel Developer হিসেবে Salary বাড়ানোর ৮টি Skill</title>
      <dc:creator>Ruhul Amin Sujon</dc:creator>
      <pubDate>Mon, 23 Feb 2026 14:09:16 +0000</pubDate>
      <link>https://dev.to/ruhul_aminsujon_f65b3678/zavisoftinv-4bjk</link>
      <guid>https://dev.to/ruhul_aminsujon_f65b3678/zavisoftinv-4bjk</guid>
      <description>&lt;p&gt;1️⃣ &lt;strong&gt;System Design &amp;amp; Scalable Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mid-level থেকে senior developer হওয়ার সবচেয়ে বড় skill।&lt;/p&gt;

&lt;p&gt;শিখতে হবে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monolithic vs Microservices&lt;/li&gt;
&lt;li&gt;Caching strategy&lt;/li&gt;
&lt;li&gt;Load balancing&lt;/li&gt;
&lt;li&gt;Queue system&lt;/li&gt;
&lt;li&gt;Database scaling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example interview question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“How would you design a SaaS system for 1 million users?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;💰 Salary impact: &lt;strong&gt;+20K to +40K&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;2️⃣ &lt;strong&gt;Advanced Laravel Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel শুধু CRUD না, advanced concepts দরকার।&lt;/p&gt;

&lt;p&gt;Important topics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service Layer&lt;/li&gt;
&lt;li&gt;Repository Pattern&lt;/li&gt;
&lt;li&gt;SOLID principles&lt;/li&gt;
&lt;li&gt;Laravel events &amp;amp; listeners&lt;/li&gt;
&lt;li&gt;Job queues&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;3️⃣ &lt;strong&gt;Microservices &amp;amp; API Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Modern SaaS system mostly API-based।&lt;/p&gt;

&lt;p&gt;Learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API gateway&lt;/li&gt;
&lt;li&gt;JWT auth&lt;/li&gt;
&lt;li&gt;Rate limiting&lt;/li&gt;
&lt;li&gt;Service-to-service communication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Laravel + Node / Go services&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;4️⃣ &lt;strong&gt;Queue &amp;amp; Background Processing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;High scale system এ এটা mandatory।&lt;/p&gt;

&lt;p&gt;Learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Redis queues&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Laravel Horizon&lt;/li&gt;
&lt;li&gt;RabbitMQ&lt;/li&gt;
&lt;li&gt;Kafka (optional)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email queue&lt;/li&gt;
&lt;li&gt;Notification system&lt;/li&gt;
&lt;li&gt;Report generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;5️⃣ &lt;strong&gt;DevOps Basics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Developer হিসেবে DevOps জানলে salary দ্রুত বাড়ে।&lt;/p&gt;

&lt;p&gt;Learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Docker&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;CI/CD (GitHub Actions / GitLab)&lt;/li&gt;
&lt;li&gt;Linux server management&lt;/li&gt;
&lt;li&gt;Nginx&lt;/li&gt;
&lt;li&gt;deployment automation&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;6️⃣ &lt;strong&gt;Cloud Platforms&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;বাংলাদেশের product companies এখন cloud ব্যবহার করছে।&lt;/p&gt;

&lt;p&gt;Learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AWS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;DigitalOcean&lt;/li&gt;
&lt;li&gt;Cloud storage&lt;/li&gt;
&lt;li&gt;CDN&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Important services:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EC2&lt;/li&gt;
&lt;li&gt;S3&lt;/li&gt;
&lt;li&gt;RDS&lt;/li&gt;
&lt;li&gt;Cloudflare&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;7️⃣ &lt;strong&gt;AI / LLM Integration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;এটা এখন &lt;strong&gt;super hot skill (2025–2026)&lt;/strong&gt;।&lt;/p&gt;

&lt;p&gt;আপনি already advantage এ আছেন কারণ আপনি:&lt;/p&gt;

&lt;p&gt;ChatGPT API project করেছেন&lt;/p&gt;

&lt;p&gt;আরও শিখতে পারেন:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAI API&lt;/li&gt;
&lt;li&gt;RAG systems&lt;/li&gt;
&lt;li&gt;Vector database&lt;/li&gt;
&lt;li&gt;AI chatbot&lt;/li&gt;
&lt;li&gt;AI automation tools&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;8️⃣ &lt;strong&gt;Modern Frontend (React / Next.js)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel backend + modern frontend developer হলে demand বেশি।&lt;/p&gt;

&lt;p&gt;Learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;React&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Next.js&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;API integration&lt;/li&gt;
&lt;li&gt;state management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full stack developer হলে salary দ্রুত বাড়ে।&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp3smryz0w7mwsqlf0jw6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp3smryz0w7mwsqlf0jw6.png" alt=" " width="800" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⭐ &lt;strong&gt;আপনার Current Strength&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;আপনার CV অনুযায়ী strong areas:&lt;/p&gt;

&lt;p&gt;✔ Laravel backend&lt;br&gt;
✔ REST API&lt;br&gt;
✔ Redis caching&lt;br&gt;
✔ SaaS / ERP systems&lt;br&gt;
✔ Government projects&lt;br&gt;
✔ AI API integration&lt;/p&gt;

&lt;p&gt;মানে আপনি &lt;strong&gt;already mid-level developer।&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;Projects&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;🚀 &lt;strong&gt;Laravel Developer এর ৫টি Powerful Side Project&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;AI SaaS Application (ChatGPT Integration)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;আপনি যেহেতু ইতিমধ্যে ChatGPT API ব্যবহার করেছেন, এটাকে &lt;strong&gt;proper SaaS project&lt;/strong&gt; বানাতে পারেন।&lt;/p&gt;

&lt;p&gt;Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI chatbot&lt;/li&gt;
&lt;li&gt;document summarizer&lt;/li&gt;
&lt;li&gt;AI content generator&lt;/li&gt;
&lt;li&gt;conversation history&lt;/li&gt;
&lt;li&gt;subscription system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tech stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Laravel&lt;/li&gt;
&lt;li&gt;OpenAI API&lt;/li&gt;
&lt;li&gt;Redis queue&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;React / Vue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recruiter impression:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Candidate understands AI integration and SaaS architecture.”&lt;/p&gt;
&lt;/blockquote&gt;



&lt;p&gt;2️⃣ &lt;strong&gt;Multi-Tenant SaaS Platform&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SaaS companies এই skill খুব value দেয়।&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SaaS CRM / Project Management Tool&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-tenant architecture&lt;/li&gt;
&lt;li&gt;Role &amp;amp; permission system&lt;/li&gt;
&lt;li&gt;Team workspace&lt;/li&gt;
&lt;li&gt;Subscription billing&lt;/li&gt;
&lt;li&gt;API access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Important concept:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tenant database / tenant middleware&lt;/li&gt;
&lt;li&gt;queue jobs&lt;/li&gt;
&lt;li&gt;API tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recruiter impression:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Candidate understands scalable SaaS systems.”&lt;/p&gt;
&lt;/blockquote&gt;



&lt;p&gt;3️⃣ &lt;strong&gt;Real-Time Notification System&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Large systems এ &lt;strong&gt;real-time architecture&lt;/strong&gt; খুব important।&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;live notifications&lt;/li&gt;
&lt;li&gt;chat system&lt;/li&gt;
&lt;li&gt;live order updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tech:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Laravel&lt;/li&gt;
&lt;li&gt;WebSockets&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;li&gt;Pusher / Socket.io&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recruiter impression:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Candidate knows event-driven architecture.”&lt;/p&gt;
&lt;/blockquote&gt;



&lt;p&gt;4️⃣ &lt;strong&gt;High-Performance REST API System&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;একটা &lt;strong&gt;scalable API platform&lt;/strong&gt; বানাতে পারেন।&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ecommerce API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JWT authentication&lt;/li&gt;
&lt;li&gt;rate limiting&lt;/li&gt;
&lt;li&gt;API versioning&lt;/li&gt;
&lt;li&gt;caching (Redis)&lt;/li&gt;
&lt;li&gt;queue jobs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Extra:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API documentation (Swagger)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recruiter impression:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Candidate understands backend engineering.”&lt;/p&gt;
&lt;/blockquote&gt;



&lt;p&gt;5️⃣ &lt;strong&gt;Microservices Laravel System&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;এটা করলে recruiter খুব impressed হয়।&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;System structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Auth Service
Order Service
Payment Service
Notification Service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tech:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Laravel Lumen / Laravel&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Redis queue&lt;/li&gt;
&lt;li&gt;API gateway&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recruiter impression:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Candidate understands distributed architecture.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;⭐ &lt;strong&gt;Bonus (আপনার জন্য best project)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;আপনার experience অনুযায়ী &lt;strong&gt;এই projectটা করলে সবচেয়ে powerful হবে:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI Customer Support SaaS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ChatGPT AI support bot&lt;/li&gt;
&lt;li&gt;ticket system&lt;/li&gt;
&lt;li&gt;knowledge base&lt;/li&gt;
&lt;li&gt;vector search&lt;/li&gt;
&lt;li&gt;admin analytics dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;এটা করলে আপনি &lt;strong&gt;AI + SaaS developer&lt;/strong&gt; হিসেবে position করতে পারবেন।&lt;/p&gt;




&lt;p&gt;📈 &lt;strong&gt;CV-তে Recruiter কী দেখতে চায়&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Strong portfolio project হলে CV-তে লিখবেন:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Built an AI-powered SaaS platform using Laravel and OpenAI API&lt;br&gt;
supporting real-time chat, queue processing, and scalable API architecture.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;এই ধরনের line recruiter খুব পছন্দ করে।&lt;/p&gt;


&lt;h1&gt;
  
  
  Roadmap
&lt;/h1&gt;



&lt;p&gt;🚀 &lt;strong&gt;Laravel Developer Salary Jump Roadmap (৬ মাস)&lt;/strong&gt;&lt;br&gt;
🟢 &lt;strong&gt;Month 1 — Advanced Laravel Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;লক্ষ্য: CRUD developer → &lt;strong&gt;professional backend engineer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;শিখুন&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service Layer Architecture&lt;/li&gt;
&lt;li&gt;Repository Pattern&lt;/li&gt;
&lt;li&gt;SOLID Principles&lt;/li&gt;
&lt;li&gt;Laravel Events &amp;amp; Listeners&lt;/li&gt;
&lt;li&gt;Laravel Jobs &amp;amp; Queues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Practice project:&lt;br&gt;
👉 Existing project refactor করে &lt;strong&gt;clean architecture বানান।&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;🟢 &lt;strong&gt;Month 2 — API Engineering &amp;amp; Security&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Modern system mostly &lt;strong&gt;API-first&lt;/strong&gt;।&lt;/p&gt;

&lt;p&gt;শিখুন:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST API best practices&lt;/li&gt;
&lt;li&gt;JWT Authentication&lt;/li&gt;
&lt;li&gt;API Rate Limiting&lt;/li&gt;
&lt;li&gt;API Versioning&lt;/li&gt;
&lt;li&gt;API documentation (Swagger / Postman)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Practice project:&lt;br&gt;
👉 &lt;strong&gt;Production-ready REST API বানান।&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;🟢 &lt;strong&gt;Month 3 — Performance &amp;amp; Scaling&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;এই skill senior developerদের differentiate করে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;শিখুন&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redis caching&lt;/li&gt;
&lt;li&gt;Laravel Horizon&lt;/li&gt;
&lt;li&gt;Database indexing&lt;/li&gt;
&lt;li&gt;Query optimization&lt;/li&gt;
&lt;li&gt;Queue workers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
👉 &lt;strong&gt;High traffic ecommerce API simulation&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;🟢 &lt;strong&gt;Month 4 — DevOps &amp;amp; Deployment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Developer হিসেবে DevOps জানলে salary দ্রুত বাড়ে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;শিখুন&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Docker&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux server management&lt;/li&gt;
&lt;li&gt;Nginx configuration&lt;/li&gt;
&lt;li&gt;CI/CD (GitHub Actions)&lt;/li&gt;
&lt;li&gt;Zero downtime deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Practice:&lt;br&gt;
👉 Project &lt;strong&gt;Docker container&lt;/strong&gt; করে deploy করুন।&lt;/p&gt;



&lt;p&gt;🟢 &lt;strong&gt;Month 5 — AI Integration (Hot Skill)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;আপনি already advantage এ আছেন।&lt;/p&gt;

&lt;p&gt;Deep dive করুন:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAI API&lt;/li&gt;
&lt;li&gt;AI chat systems&lt;/li&gt;
&lt;li&gt;RAG (Retrieval Augmented Generation)&lt;/li&gt;
&lt;li&gt;Vector database (Pinecone / Weaviate)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Project:&lt;br&gt;
👉 &lt;strong&gt;AI SaaS chatbot platform&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;🟢 &lt;strong&gt;Month 6 — System Design&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Senior developer interview এর সবচেয়ে important skill।&lt;/p&gt;

&lt;p&gt;শিখুন:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System design basics&lt;/li&gt;
&lt;li&gt;Monolith vs Microservices&lt;/li&gt;
&lt;li&gt;Event-driven architecture&lt;/li&gt;
&lt;li&gt;Load balancing&lt;/li&gt;
&lt;li&gt;CDN / caching strategy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Practice:&lt;/p&gt;

&lt;p&gt;👉 Design system like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Uber backend&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WhatsApp chat system&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SaaS platform architecture&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;📈 &lt;strong&gt;Expected Result After 6 Months&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;আপনি তখন comfortable হবেন:&lt;/p&gt;

&lt;p&gt;✔ Scalable backend systems&lt;br&gt;
✔ SaaS architecture&lt;br&gt;
✔ AI integrations&lt;br&gt;
✔ DevOps deployment&lt;br&gt;
✔ System design interviews&lt;/p&gt;

&lt;p&gt;এগুলো থাকলে বাংলাদেশে salary range সাধারণত:&lt;/p&gt;

&lt;p&gt;💰 &lt;strong&gt;80K – 120K+&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;⭐ &lt;strong&gt;Extra Tip (Recruiter Trick)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;আপনার GitHub / portfolio তে &lt;strong&gt;এই ৩টা project থাকলে interview chance অনেক বাড়ে&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;1️⃣ AI SaaS project&lt;br&gt;
2️⃣ Scalable API platform&lt;br&gt;
3️⃣ Multi-tenant SaaS system&lt;/p&gt;



&lt;p&gt;Avoid Mistakes&lt;/p&gt;



&lt;p&gt;বাংলাদেশে অনেক &lt;strong&gt;Laravel developer ৩–৪ বছর experience থাকার পরেও ৪০K–৫০K salary&lt;/strong&gt;-তেই আটকে থাকে। সাধারণত এর পেছনে কিছু common mistake থাকে। নিচে &lt;strong&gt;৫টা সবচেয়ে বড় mistake&lt;/strong&gt; দিলাম—যেগুলো avoid করলে career growth অনেক দ্রুত হয়।&lt;/p&gt;



&lt;p&gt;🚫 &lt;strong&gt;Laravel Developer Career Growth থামিয়ে দেয় এমন ৫টি Mistake&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;শুধু CRUD Developer হয়ে থাকা&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;অনেক developer শুধু এই কাজগুলো করে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;controller&lt;/li&gt;
&lt;li&gt;model&lt;/li&gt;
&lt;li&gt;migration&lt;/li&gt;
&lt;li&gt;&lt;p&gt;basic CRUD&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CRUD module&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Admin panel&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Form submit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Basic API&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;কিন্তু modern backend এ লাগে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;system design&lt;/li&gt;
&lt;li&gt;queue processing&lt;/li&gt;
&lt;li&gt;caching&lt;/li&gt;
&lt;li&gt;scalable architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recruiter তখন ভাবে:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Candidate junior level mindset।”&lt;/p&gt;

&lt;p&gt;“এই developer শুধু feature implement করে, system design করতে পারে না।”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;✔ Solution&lt;br&gt;
Advanced Laravel concepts শিখুন:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service layer&lt;/li&gt;
&lt;li&gt;Repository pattern&lt;/li&gt;
&lt;li&gt;Queue systems&lt;/li&gt;
&lt;li&gt;Event-driven architecture&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;2️⃣ &lt;strong&gt;Production System কীভাবে Scale হয় না জানা&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;অনেক developer জানে না:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redis caching&lt;/li&gt;
&lt;li&gt;queue workers&lt;/li&gt;
&lt;li&gt;database indexing&lt;/li&gt;
&lt;li&gt;load optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;যখন interview এ জিজ্ঞেস করে:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“1 million users হলে system কীভাবে handle করবেন?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;তখন answer দিতে পারে না।&lt;/p&gt;



&lt;p&gt;3️⃣ &lt;strong&gt;GitHub / Portfolio না থাকা&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;বাংলাদেশে অনেক developer এর:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub empty&lt;/li&gt;
&lt;li&gt;real project নেই&lt;/li&gt;
&lt;li&gt;code sample নেই&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recruiter তখন evaluate করতে পারে না।&lt;/p&gt;

&lt;p&gt;Strong developer এর usually থাকে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;open-source repo&lt;/li&gt;
&lt;li&gt;SaaS side project&lt;/li&gt;
&lt;li&gt;API project&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;2️⃣ &lt;strong&gt;API Architecture না শেখা&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Modern applications প্রায় সবই &lt;strong&gt;API-first&lt;/strong&gt;।&lt;/p&gt;

&lt;p&gt;অনেক Laravel developer শুধু blade-based system বানায়।&lt;/p&gt;

&lt;p&gt;কিন্তু market demand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST API&lt;/li&gt;
&lt;li&gt;API security&lt;/li&gt;
&lt;li&gt;JWT auth&lt;/li&gt;
&lt;li&gt;API rate limiting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✔ Solution&lt;br&gt;
কমপক্ষে &lt;strong&gt;৩টা production-level API project বানান।&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;5️⃣ &lt;strong&gt;New Technology শেখে না&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;অনেক Laravel developer stuck থাকে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP + jQuery&lt;/li&gt;
&lt;li&gt;basic Laravel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;কিন্তু market demand এখন:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React / Next.js&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Cloud&lt;/li&gt;
&lt;li&gt;AI integration&lt;/li&gt;
&lt;li&gt;Microservices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;যারা এগুলো শেখে না তারা &lt;strong&gt;career plateau তে চলে যায়।&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;3️⃣ &lt;strong&gt;DevOps না জানা&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;বাংলাদেশে অনেক developer শুধু coding জানে।&lt;/p&gt;

&lt;p&gt;কিন্তু company চায়:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;server deployment&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;CI/CD&lt;/li&gt;
&lt;li&gt;Linux server management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;DevOps skill থাকলে developer &lt;strong&gt;more valuable&lt;/strong&gt; হয়ে যায়।&lt;/p&gt;



&lt;p&gt;4️⃣ &lt;strong&gt;Strong Portfolio না থাকা&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;অনেক developer CV-তে লিখে:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Worked on ERP system”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;কিন্তু recruiter proof দেখতে চায়:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub project&lt;/li&gt;
&lt;li&gt;live SaaS product&lt;/li&gt;
&lt;li&gt;technical architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✔ Solution&lt;br&gt;
কমপক্ষে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2 strong GitHub project&lt;/li&gt;
&lt;li&gt;1 SaaS project&lt;/li&gt;
&lt;li&gt;1 API platform&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;5️⃣ &lt;strong&gt;Job Switch না করা&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;বাংলাদেশে salary growth বেশি হয় &lt;strong&gt;job change করলে&lt;/strong&gt;।&lt;/p&gt;

&lt;p&gt;Typical pattern:&lt;/p&gt;

&lt;p&gt;Years   Same Company Salary&lt;br&gt;
1 year  25K&lt;br&gt;
2 years 35K&lt;br&gt;
3 years 45K&lt;/p&gt;

&lt;p&gt;কিন্তু job switch করলে:&lt;/p&gt;

&lt;p&gt;Experience  Salary&lt;br&gt;
3 years 60K – 90K&lt;/p&gt;



&lt;p&gt;✅ &lt;strong&gt;Good News (আপনার জন্য)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;আপনার CV অনুযায়ী আপনি already কিছু advantage এ আছেন:&lt;/p&gt;

&lt;p&gt;✔ REST API&lt;br&gt;
✔ Redis caching&lt;br&gt;
✔ SaaS / ERP systems&lt;br&gt;
✔ Government projects&lt;br&gt;
✔ AI API integration&lt;/p&gt;

&lt;p&gt;মানে আপনি &lt;strong&gt;stuck developer category তে না।&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;⭐ &lt;strong&gt;Bonus Career Advice&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;আপনার profile অনুযায়ী এই &lt;strong&gt;৩টা skill add করলে fastest growth হবে&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;System design&lt;/strong&gt;&lt;br&gt;
2️⃣ &lt;strong&gt;AI integration&lt;/strong&gt;&lt;br&gt;
3️⃣ &lt;strong&gt;DevOps (Docker + CI/CD)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;আপনি already &lt;strong&gt;ChatGPT API project&lt;/strong&gt; করেছেন—এটা market এ &lt;strong&gt;big advantage&lt;/strong&gt;।&lt;/p&gt;


&lt;h1&gt;
  
  
  high-demand tech stack
&lt;/h1&gt;



&lt;p&gt;🚀 &lt;strong&gt;২০২৬ সালে Laravel Developerদের জন্য High-Demand Tech Stack&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;Backend Core Stack&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;এটা আপনার main foundation।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tech&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP 8+&lt;/li&gt;
&lt;li&gt;Laravel 10/11&lt;/li&gt;
&lt;li&gt;REST API / GraphQL&lt;/li&gt;
&lt;li&gt;JWT / OAuth authentication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why important&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Modern SaaS, fintech, ERP — সব জায়গায় &lt;strong&gt;API-first architecture&lt;/strong&gt; চলছে।&lt;/p&gt;



&lt;p&gt;2️⃣ &lt;strong&gt;Modern Frontend Stack&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel developer হলে এখন frontend skill থাকাও গুরুত্বপূর্ণ।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Most demanded&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React.js&lt;/li&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;Vue.js&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Best combo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Laravel API + React / Next.js frontend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এটা SaaS product company গুলো খুব পছন্দ করে।&lt;/p&gt;




&lt;p&gt;3️⃣ &lt;strong&gt;Database &amp;amp; Caching Stack&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;High-performance backend এর জন্য।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tech&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MySQL / PostgreSQL&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;li&gt;Elasticsearch (optional)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;caching&lt;/li&gt;
&lt;li&gt;search engine&lt;/li&gt;
&lt;li&gt;session storage&lt;/li&gt;
&lt;li&gt;queue system&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;4️⃣ &lt;strong&gt;Queue &amp;amp; Background Processing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;High-scale systems এ mandatory।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tech&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redis queues&lt;/li&gt;
&lt;li&gt;Laravel Horizon&lt;/li&gt;
&lt;li&gt;RabbitMQ / Kafka (advanced)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;email queue&lt;/li&gt;
&lt;li&gt;notification system&lt;/li&gt;
&lt;li&gt;report generation&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;5️⃣ &lt;strong&gt;DevOps &amp;amp; Deployment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;এটা জানলে salary খুব দ্রুত বাড়ে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tech&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Linux server&lt;/li&gt;
&lt;li&gt;Nginx&lt;/li&gt;
&lt;li&gt;CI/CD (GitHub Actions / GitLab)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deployment stack example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Laravel + Docker + Nginx + CI/CD pipeline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;6️⃣ &lt;strong&gt;Cloud Platforms&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Product companies এখন mostly cloud use করে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Most used&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS&lt;/li&gt;
&lt;li&gt;DigitalOcean&lt;/li&gt;
&lt;li&gt;Cloudflare&lt;/li&gt;
&lt;li&gt;S3 storage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Important services:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EC2&lt;/li&gt;
&lt;li&gt;RDS&lt;/li&gt;
&lt;li&gt;CDN&lt;/li&gt;
&lt;li&gt;Object storage&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;7️⃣ &lt;strong&gt;AI Integration (2025–2026 Hot Skill)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;এটা এখন developer market এ &lt;strong&gt;game changer&lt;/strong&gt;।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tech&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAI API&lt;/li&gt;
&lt;li&gt;AI chatbot systems&lt;/li&gt;
&lt;li&gt;RAG architecture&lt;/li&gt;
&lt;li&gt;vector database&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI support bot&lt;/li&gt;
&lt;li&gt;AI content generator&lt;/li&gt;
&lt;li&gt;AI automation tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;আপনি যেহেতু &lt;strong&gt;ChatGPT API project করেছেন, এটা already big advantage।&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;⭐ &lt;strong&gt;Most Powerful Stack Combination (Bangladesh Market)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;২০২৬ সালে সবচেয়ে demanded stack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Laravel + React/Next.js
Redis + Queue
Docker + AWS
AI API integration

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এই stack থাকলে developer salary সাধারণত:&lt;/p&gt;

&lt;p&gt;💰 &lt;strong&gt;80K – 150K+&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;📈 &lt;strong&gt;আপনার Current Stack vs Market&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;আপনার CV অনুযায়ী already আছে:&lt;/p&gt;

&lt;p&gt;✔ Laravel&lt;br&gt;
✔ Vue / React&lt;br&gt;
✔ REST API&lt;br&gt;
✔ Redis&lt;br&gt;
✔ SaaS / ERP projects&lt;/p&gt;

&lt;p&gt;Add করলে সবচেয়ে লাভ হবে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;AWS&lt;/li&gt;
&lt;li&gt;System design&lt;/li&gt;
&lt;li&gt;AI SaaS project&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>backend</category>
      <category>database</category>
      <category>sql</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Laravel IQ - Level 1 - Part 5</title>
      <dc:creator>Ruhul Amin Sujon</dc:creator>
      <pubDate>Sat, 31 Jan 2026 17:08:29 +0000</pubDate>
      <link>https://dev.to/ruhul_aminsujon_f65b3678/laravel-iq-level-1-part-5-3bid</link>
      <guid>https://dev.to/ruhul_aminsujon_f65b3678/laravel-iq-level-1-part-5-3bid</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ১:&lt;/em&gt;&lt;/strong&gt; আমার ম্যানুবার ডাটাবেইজ এ সেভ আছে &amp;amp; cache use করে লোড করাই। এখন আমি আবার নতুন একটা মেনুবার এড করলাম, ওই লগিন করা ইউজার রিয়েল টাইমে কিভাবে মেনুটা পাবে? best approach টা বলো আমাকে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;Problem Recap (তুমি যা বলছো)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Menu DB তে সেভ করা&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Performance এর জন্য cache থেকে menu load করছো&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;❓ এখন &lt;strong&gt;নতুন menu add করলে&lt;/strong&gt;,
👉 already &lt;strong&gt;login করা user&lt;/strong&gt; কীভাবে** real-time** নতুন menu পাবে?&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;🎯 &lt;strong&gt;Short Answer (Interview-Ready):&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Best approach হলো:&lt;/strong&gt;&lt;br&gt;
👉 &lt;strong&gt;Cache Invalidation + Event/Broadcast (WebSocket) + Smart Frontend Refresh&lt;/strong&gt;&lt;br&gt;
সব ক্ষেত্রে full real-time socket দরকার হয় না — requirement অনুযায়ী solution নিতে হয়।&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;✅ &lt;strong&gt;Best Approaches (Priority অনুযায়ী)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;আমি তোমাকে &lt;strong&gt;৩টা practical approach&lt;/strong&gt; দেবো — production-ready।&lt;/p&gt;




&lt;p&gt;🥇 &lt;strong&gt;Approach 1: Cache Invalidation + Next Request Reload (MOST COMMON &amp;amp; BEST)&lt;/strong&gt;&lt;br&gt;
🔹 &lt;strong&gt;Concept&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Menu add/update/delete হলে &lt;strong&gt;menu cache clear&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;User এর &lt;strong&gt;next request&lt;/strong&gt; এ menu আবার DB থেকে load হয়ে cache হবে&lt;/li&gt;
&lt;li&gt;Simple, scalable, safe&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;Backend Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// MenuController.php
public function store(Request $request)
{
    Menu::create($request-&amp;gt;all());


    Cache::forget('menus'); // 🔥 cache invalidate
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 &lt;strong&gt;Menu Load:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$menus = Cache::remember('menus', 3600, function () {
    return Menu::active()-&amp;gt;get();
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 &lt;strong&gt;Result&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User page reload / API call করলেই নতুন menu পাবে&lt;/li&gt;
&lt;li&gt;90% SaaS, ERP, Admin panel এ এটাই ব্যবহার হয়&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple&lt;/li&gt;
&lt;li&gt;No extra infra&lt;/li&gt;
&lt;li&gt;Highly scalable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ &lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Strict “real-time” না (reload লাগবে)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;If requirement না বলে “instant live without reload”&lt;/strong&gt; → &lt;strong&gt;THIS IS BEST&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;🥈 &lt;strong&gt;Approach 2: Event + Broadcast (Real-Time without reload)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;যদি requirement হয়:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Admin menu add করলেই user &lt;strong&gt;instant&lt;/strong&gt; menu পাবে (no refresh)”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;তাহলে 👇&lt;/p&gt;




&lt;p&gt;🔹 &lt;strong&gt;Flow&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Admin adds menu
 → MenuCreated Event
 → Cache clear
 → Broadcast event
 → Frontend listens
 → Menu API refetch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🔹 &lt;strong&gt;Backend: Event&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;event(new MenuUpdated());
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🔹 &lt;strong&gt;Event Class:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MenuUpdated implements ShouldBroadcast
{
    public function broadcastOn()
    {
        return new Channel('menu-channel');
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🔹 &lt;strong&gt;Frontend (Vue / JS example):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Echo.channel('menu-channel')
    .listen('MenuUpdated', () =&amp;gt; {
        fetchMenus(); // API call করে নতুন menu আনবে
    });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🔹 &lt;strong&gt;Result:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User login অবস্থাতেই menu auto update&lt;/li&gt;
&lt;li&gt;No reload needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time UX&lt;/li&gt;
&lt;li&gt;Modern feel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ &lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redis / WebSocket setup&lt;/li&gt;
&lt;li&gt;Complexity বেশি&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;Use when&lt;/strong&gt;:&lt;br&gt;
Dashboard / POS / Live admin systems&lt;/p&gt;



&lt;p&gt;🥉 &lt;strong&gt;Approach 3: Cache Versioning (Very Smart &amp;amp; Scalable)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔥 এটা &lt;strong&gt;senior-level trick&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;🔹 &lt;strong&gt;Concept&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Menu cache key এর সাথে version যুক্ত করো&lt;/li&gt;
&lt;li&gt;Menu update হলে version change&lt;/li&gt;
&lt;li&gt;Old cache auto-ignore হয়ে যাবে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;Example&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$version = Cache::get('menu_version', 1);


$menus = Cache::remember("menus_v{$version}", 3600, function () {
    return Menu::all();
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 &lt;strong&gt;Menu update হলে:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cache::increment('menu_version');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 &lt;strong&gt;Result&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No need to flush cache&lt;/li&gt;
&lt;li&gt;Zero race condition&lt;/li&gt;
&lt;li&gt;Highly scalable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean architecture&lt;/li&gt;
&lt;li&gt;Multi-server safe&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ &lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;একটু advanced thinking লাগে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;Use when&lt;/strong&gt;:&lt;br&gt;
Large-scale SaaS / multi-tenant system&lt;/p&gt;



&lt;p&gt;❌ &lt;strong&gt;What NOT to do (Bad Practice)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🚫 &lt;code&gt;Cache::flush()&lt;/code&gt;&lt;br&gt;
🚫 Every second polling&lt;br&gt;
🚫 Force logout users&lt;br&gt;
🚫 DB hit on every request&lt;/p&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjp5n1rsbmllivt3budtz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjp5n1rsbmllivt3budtz.png" alt=" " width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🎯 &lt;strong&gt;Interview Killer Answer (1–2 lines):&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Menu update হলে আমি &lt;strong&gt;menu cache invalidate করি।&lt;/strong&gt;&lt;br&gt;
Real-time দরকার হলে &lt;strong&gt;Laravel Event + Broadcast&lt;/strong&gt; ব্যবহার করে frontend কে menu refetch করতে বলি।&lt;br&gt;
Large system হলে &lt;strong&gt;cache versioning strategy&lt;/strong&gt; ব্যবহার করি।&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 2:&lt;/em&gt;&lt;/strong&gt; Production এ redis configure কিভাবে? &lt;br&gt;
i. shared hosing (c-panel), &lt;br&gt;
ii. VPS , &lt;br&gt;
iii. AWS &amp;amp; after production configure , &lt;br&gt;
.env তে কি কি change করতে হবে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Production-এ Redis Configure করার পূর্ণ গাইড (Laravel)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;আমি ৩টা environment আলাদা করে বলবো:&lt;/p&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;Shared Hosting (cPanel)&lt;/strong&gt;&lt;br&gt;
2️⃣ &lt;strong&gt;VPS (DigitalOcean / Contabo / Vultr ইত্যাদি)&lt;/strong&gt;&lt;br&gt;
3️⃣ &lt;strong&gt;AWS (EC2 / ElastiCache)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;তারপর বলবো 👉 &lt;code&gt;.env&lt;/code&gt;-এ &lt;strong&gt;কী কী change করতে হবে&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;🧠 &lt;strong&gt;আগে বুঝে নাও: Laravel Redis কেন ব্যবহার করে?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel Redis ব্যবহার করে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cache&lt;/li&gt;
&lt;li&gt;Queue&lt;/li&gt;
&lt;li&gt;Session&lt;/li&gt;
&lt;li&gt;Broadcast&lt;/li&gt;
&lt;li&gt;Rate limiting&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;🟡 &lt;strong&gt;i. Shared Hosting (cPanel) এ Redis Configure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Reality check:&lt;/strong&gt;&lt;br&gt;
সব shared hosting এ Redis support করে না।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Prerequisites&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hosting provider Redis enable করে দিতে হবে&lt;/li&gt;
&lt;li&gt;PHP Redis extension (&lt;code&gt;phpredis&lt;/code&gt;) enabled থাকতে হবে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;Step 1: cPanel → Redis Enable&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cPanel → Select PHP Version&lt;/li&gt;
&lt;li&gt;Extensions → ✔️ &lt;code&gt;redis&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;Step 2: Laravel &lt;code&gt;.env&lt;/code&gt; config&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis


REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 Shared hosting এ সাধারণত:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;REDIS_HOST=127.0.0.1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Password থাকে না&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;Step 3: config clear&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan config:clear
php artisan cache:clear
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;❌ &lt;strong&gt;Limitation (Shared Hosting):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redis restart control নেই&lt;/li&gt;
&lt;li&gt;Performance limited&lt;/li&gt;
&lt;li&gt;Queue worker চালানো যায় না&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;Small project / cache only হলে OK&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;🟢 &lt;strong&gt;ii. VPS-এ Redis Configure (BEST PRACTICE)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;এইটা সবচেয়ে common &amp;amp; professional setup।&lt;/p&gt;




&lt;p&gt;🔹 &lt;strong&gt;Step 1: Redis Install (Ubuntu)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update
sudo apt install redis-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 &lt;strong&gt;Step 2: Redis Secure &amp;amp; Optimize&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nano /etc/redis/redis.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;supervised systemd
bind 127.0.0.1
requirepass strongpassword
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl restart redis
sudo systemctl enable redis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis-cli ping
# PONG
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 &lt;strong&gt;Step 3: PHP Redis Extension Install&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install php-redis
sudo systemctl restart php8.2-fpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 &lt;strong&gt;Step 4: Laravel &lt;code&gt;.env&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis


REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=strongpassword
REDIS_PORT=6379
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 &lt;strong&gt;Step 5: Queue Worker (Production MUST)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan queue:work --daemon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or better:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo supervisorctl start laravel-worker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;VPS Advantages&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full control&lt;/li&gt;
&lt;li&gt;Best performance&lt;/li&gt;
&lt;li&gt;Redis + Queue + Horizon সব possible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;Recommended for SaaS / ERP / API&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;🔵 &lt;strong&gt;iii. AWS-এ Redis Configure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AWS-এ ২টা option থাকে:&lt;/p&gt;




&lt;p&gt;🔹 &lt;strong&gt;Option A: Redis inside EC2 (VPS-like)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Exactly VPS-এর মতোই setup&lt;br&gt;
👉 &lt;strong&gt;Not recommended for production scale&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;🔹 &lt;strong&gt;Option B: AWS ElastiCache (BEST PRACTICE)&lt;/strong&gt;**&lt;/p&gt;

&lt;p&gt;✔️ Managed Redis&lt;br&gt;
✔️ Auto scaling&lt;br&gt;
✔️ High availability&lt;/p&gt;



&lt;p&gt;🔹 &lt;strong&gt;Step 1: Create ElastiCache Redis&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS Console → ElastiCache&lt;/li&gt;
&lt;li&gt;Engine: Redis&lt;/li&gt;
&lt;li&gt;Node type: cache.t3.micro (small)&lt;/li&gt;
&lt;li&gt;Enable Auth Token&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;Step 2: Security Group&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Allow Redis port 6379&lt;/li&gt;
&lt;li&gt;Only from EC2 private IP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;Step 3: Laravel&lt;/strong&gt; &lt;code&gt;.env&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis


REDIS_CLIENT=phpredis
REDIS_HOST=redis-cluster.xxxxxx.cache.amazonaws.com
REDIS_PASSWORD=auth-token
REDIS_PORT=6379
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 &lt;strong&gt;Important&lt;/strong&gt;:&lt;br&gt;
EC2 + Redis must be in same VPC&lt;/p&gt;



&lt;p&gt;✅ &lt;strong&gt;AWS Redis Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero maintenance&lt;/li&gt;
&lt;li&gt;Auto failover&lt;/li&gt;
&lt;li&gt;Production-grade&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;Enterprise / high traffic app এর জন্য BEST&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;🔧 &lt;strong&gt;Production&lt;/strong&gt; &lt;code&gt;.env&lt;/code&gt; &lt;strong&gt;– Common Redis Config&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis


REDIS_CLIENT=phpredis
REDIS_HOST=
REDIS_PASSWORD=
REDIS_PORT=6379
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Optional (multiple DB):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;REDIS_DB=0
REDIS_CACHE_DB=1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;❌ &lt;strong&gt;Common Mistakes (Interview Trap ⚠️)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🚫 &lt;code&gt;Cache::flush()&lt;/code&gt; production এ&lt;br&gt;
🚫 Redis open to public IP&lt;br&gt;
🚫 &lt;code&gt;.env&lt;/code&gt; change করে config clear না করা&lt;br&gt;
🚫 Queue worker না চালানো&lt;/p&gt;



&lt;p&gt;🏆 &lt;strong&gt;Which Setup Should You Choose?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fewooh9wl19enx9qyiv67.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fewooh9wl19enx9qyiv67.png" alt=" " width="800" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🎯 &lt;strong&gt;Interview-Ready One-Line Answer:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Production-এ Redis configure করতে আমি environment অনুযায়ী setup করি।&lt;br&gt;
VPS-এ Redis server install করে &lt;code&gt;.env&lt;/code&gt;-এ cache, session, queue redis করি।&lt;br&gt;
AWS-এ ElastiCache ব্যবহার করি scalability ও reliability এর জন্য।&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 3:&lt;/em&gt;&lt;/strong&gt; আমার ১ মতো মিলিয়ন ডাটা আছে। আমাকে একটা পেজেই দেখাতে হবে। chunk  ব্যবহার করা ভালো হবে নাকি ajax ব্যবহার করা ভালো হবে? &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;সংক্ষিপ্ত উত্তর 👉 &lt;strong&gt;chunk না, AJAX (pagination / lazy loading / infinite scroll)&lt;/strong&gt;&lt;br&gt;
এখন বিস্তারিতভাবে &lt;strong&gt;কেন&lt;/strong&gt; সেটা বুঝিয়ে দিচ্ছি।&lt;/p&gt;



&lt;p&gt;🔥 &lt;strong&gt;মূল কথা (Very Important)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;১ মিলিয়ন ডাটা এক পেজে একসাথে দেখানো বাস্তবে অসম্ভব ও ভুল ডিজাইন&lt;/strong&gt;&lt;br&gt;
এটা করলে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server memory crash হতে পারে&lt;/li&gt;
&lt;li&gt;Browser hang করবে&lt;/li&gt;
&lt;li&gt;User experience ভয়াবহ হবে&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;🧩 &lt;strong&gt;Chunk vs AJAX – আসলে কোনটা কী কাজে?&lt;/strong&gt;&lt;br&gt;
🔹 &lt;strong&gt;Chunk কী?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;chunk()&lt;/code&gt; ব্যবহার হয় &lt;strong&gt;server-side data processing&lt;/strong&gt; এর জন্য&lt;br&gt;
👉 UI-তে ডাটা দেখানোর জন্য না&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User::chunk(1000, function ($users) {
    foreach ($users as $user) {
        // process data (email, export, update)
    }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✔ Memory safe&lt;br&gt;
❌ Frontend rendering-এর জন্য নয়&lt;/p&gt;



&lt;p&gt;🔹 &lt;strong&gt;AJAX কী?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AJAX ব্যবহার হয় &lt;strong&gt;frontend-এ ধাপে ধাপে data লোড করার জন্য&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fetch('/users?page=2')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✔ Fast UI&lt;br&gt;
✔ Scalable&lt;br&gt;
✔ Real-world solution&lt;/p&gt;



&lt;p&gt;✅ &lt;strong&gt;সঠিক Solution Architecture (Best Practice)&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Option 1: Pagination (সবচেয়ে recommended)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$users = User::paginate(50);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Frontend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{ $users-&amp;gt;links() }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✔ Simple&lt;br&gt;
✔ SEO friendly&lt;br&gt;
✔ Production safe&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Option 2: AJAX Pagination (Modern UX)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$users = User::paginate(50);
return response()-&amp;gt;json($users);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JS দিয়ে page load&lt;/p&gt;

&lt;p&gt;✔ Smooth experience&lt;br&gt;
✔ No page reload&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Option 3: Infinite Scroll / Lazy Load&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$users = User::cursorPaginate(50);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✔ Facebook / YouTube style&lt;br&gt;
✔ Large data friendly&lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;Extra Optimization (1 million data হলে MUST)&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Index ব্যবহার&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE INDEX idx_created_at ON users(created_at);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;cursorPaginate (pagination এর চেয়ে fast)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User::cursorPaginate(100);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Select only required columns&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User::select('id','name')-&amp;gt;cursorPaginate(50);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbfb973d96mp3fscqm6xm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbfb973d96mp3fscqm6xm.png" alt=" " width="800" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;Interview Ready Answer&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&amp;gt; chunk() server-side heavy processing-এর জন্য, আর ১ মিলিয়ন ডাটা UI-তে দেখানোর জন্য AJAX pagination / lazy loading ব্যবহার করা উচিত।&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🏁 &lt;strong&gt;Final Recommendation (Your Case)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;AJAX + cursor pagination + proper indexing&lt;/strong&gt;&lt;br&gt;
👉 কখনোই ১ মিলিয়ন row এক পেজে render করবে না&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 4:&lt;/em&gt;&lt;/strong&gt; কিন্তু ক্লায়েন্টের রিকয়ারমেন্ট হলো ফেসবুক পোস্টের মতো স্ক্রল করে ডেটা লোড করা। অর্থাৎ, স্ক্রল করার সাথে সাথে অনবরত পোস্ট লোড হতে থাকবে এবং প্রদর্শিত হবে। তারা এই লিস্টের ক্ষেত্রেও ঠিক একই জিনিস চাচ্ছে। আমি এটি কীভাবে করতে পারি?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;এটা আসলে &lt;strong&gt;Facebook-style Infinite Scroll&lt;/strong&gt; requirement 👍&lt;br&gt;
এই ক্ষেত্রে &lt;strong&gt;AJAX + Cursor Pagination&lt;/strong&gt; ব্যবহার করাই একমাত্র production-safe solution।&lt;br&gt;
আমি পুরো flow + Laravel + JS example দিয়ে বুঝিয়ে দিচ্ছি।&lt;/p&gt;



&lt;p&gt;🧠 &lt;strong&gt;Core Idea (Facebook যেভাবে করে)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;❌ একবারে ১ মিলিয়ন ডাটা লোড না&lt;br&gt;
✅ &lt;strong&gt;প্রথমে অল্প ডাটা&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Scroll করলে পরের ডাটা&lt;/strong&gt;&lt;br&gt;
✅ User বুঝতেই পারে না যে backend-এ pagination চলছে&lt;/p&gt;

&lt;p&gt;🏗️ &lt;strong&gt;Architecture (High Level)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser scroll
   ↓
AJAX request (cursor / page)
   ↓
Laravel API
   ↓
Database (indexed)
   ↓
JSON response
   ↓
Append to DOM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Step 1: Database Optimization (Must)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 যেই column দিয়ে order করবে, সেটাতে index লাগবে&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE INDEX idx_id ON posts(id);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Facebook-style feed সাধারণত:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ORDER BY id DESC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;✅ &lt;strong&gt;Step 2: Laravel Controller (cursorPaginate)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;code&gt;paginate()&lt;/code&gt; না, cursorPaginate() ব্যবহার করো (১ মিলিয়নের জন্য best)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function posts(Request $request)
{
    $posts = Post::select('id', 'title', 'body')
        -&amp;gt;orderByDesc('id')
        -&amp;gt;cursorPaginate(10);

    return response()-&amp;gt;json($posts);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 কেন cursorPaginate?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OFFSET ব্যবহার করে না&lt;/li&gt;
&lt;li&gt;Large dataset-এ fast&lt;/li&gt;
&lt;li&gt;Memory efficient&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;✅ &lt;strong&gt;Step 3: Route&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Route::get('/posts', [PostController::class, 'posts']);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Step 4: Frontend HTML&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div id="post-container"&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div id="loader"&amp;gt;Loading...&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Step 5: JavaScript (Infinite Scroll)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let nextPageUrl = '/posts';

function loadPosts() {
    if (!nextPageUrl) return;

    fetch(nextPageUrl)
        .then(res =&amp;gt; res.json())
        .then(data =&amp;gt; {
            data.data.forEach(post =&amp;gt; {
                document.getElementById('post-container')
                    .insertAdjacentHTML(
                        'beforeend',
                        `&amp;lt;div class="post"&amp;gt;
                            &amp;lt;h4&amp;gt;${post.title}&amp;lt;/h4&amp;gt;
                            &amp;lt;p&amp;gt;${post.body}&amp;lt;/p&amp;gt;
                        &amp;lt;/div&amp;gt;`
                    );
            });

            nextPageUrl = data.next_page_url;
            document.getElementById('loader').style.display = 'none';
        });
}

window.addEventListener('scroll', () =&amp;gt; {
    if (
        window.innerHeight + window.scrollY &amp;gt;= document.body.offsetHeight - 200
    ) {
        document.getElementById('loader').style.display = 'block';
        loadPosts();
    }
});

// First load
loadPosts();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🔥 &lt;strong&gt;Result&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✔ First page loads fast&lt;br&gt;
✔ Scroll করলে auto load&lt;br&gt;
✔ User মনে করে সব এক পেজেই আছে&lt;br&gt;
✔ Backend safe even with 1M rows&lt;/p&gt;



&lt;p&gt;⚠️ &lt;strong&gt;Important Production Tips&lt;/strong&gt;&lt;br&gt;
1️⃣ &lt;strong&gt;Throttle AJAX calls&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let loading = false;
if (loading) return;
loading = true;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2️⃣ &lt;strong&gt;Stop when no data&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (!nextPageUrl) {
    loader.innerText = 'No more posts';
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3️⃣ &lt;strong&gt;Cache (Optional)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cache::remember("posts_{$cursor}", 30, fn() =&amp;gt; $posts);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧠 &lt;strong&gt;Interview-Ready Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Facebook-style infinite scroll করতে AJAX + cursor pagination ব্যবহার করা হয়।&lt;br&gt;
এতে large dataset efficiently load হয়, offset query এড়ানো যায়, এবং smooth UX পাওয়া যায়।&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🏁 &lt;strong&gt;Final Recommendation (Exactly your case)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ AJAX&lt;br&gt;
✅ cursorPaginate()&lt;br&gt;
✅ Indexed column&lt;br&gt;
✅ Infinite scroll JS&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 5:&lt;/em&gt;&lt;/strong&gt; “How would you design a SaaS system for 1 million users?” or “1 million users হলে system কীভাবে handle করবেন?”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
Strong answer structure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Load Balancer&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Nginx / AWS Load Balancer&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Multiple App Servers&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Laravel app multiple instances&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Database optimization&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;indexing&lt;/li&gt;
&lt;li&gt;read replicas&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Caching&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Queue system&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;background jobs&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;CDN&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;static files via Cloudflare&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example short answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I would scale the system using load balancers, multiple Laravel app servers, Redis caching, queue workers for background jobs, optimized database indexing, and CDN for static assets.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Q_06&lt;/em&gt;&lt;/strong&gt;: Laravel এ csrf token কীভাবে জেনারেট হয় &amp;amp; ডাটাবেইজ এর কোথায় সেভ হয় &amp;amp; কিভাবে টোকেন ভ্যালিডেশন করে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;CSRF Token কী?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CSRF (Cross-Site Request Forgery)&lt;/strong&gt; attack থেকে বাঁচার জন্য Laravel প্রতিটি state-changing request (POST, PUT, DELETE, PATCH) এ একটি secret token ব্যবহার করে।&lt;/p&gt;

&lt;p&gt;2️⃣ &lt;strong&gt;CSRF Token কীভাবে Generate হয়?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 CSRF token তৈরি হয় session start হওয়ার সময়।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**কোথায়?**
Illuminate\Session\Middleware\StartSession
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;কীভাবে?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Laravel একটি random 40 character string তৈরি করে&lt;/li&gt;
&lt;li&gt;এটি session-এর মধ্যে &lt;code&gt;_token&lt;/code&gt; নামে সেট করে
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;csrf_token(); // helper function
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এটা আসলে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;session()-&amp;gt;token();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3️⃣ &lt;strong&gt;CSRF Token কোথায় Save হয়?&lt;/strong&gt;&lt;br&gt;
❌ &lt;strong&gt;Database এ নয়&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;CSRF token কখনো database এ save হয় না&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Save হয়&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Session storage এ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Session driver অনুযায়ী location বদলায়:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Session Driver      Token কোথায় থাকে
file (default)      storage/framework/sessions/
database        sessions table
redis               Redis memory
cookie              Encrypted cookie
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 কিন্তু token সবসময় &lt;strong&gt;session data&lt;/strong&gt;-এর অংশ&lt;/p&gt;




&lt;p&gt;4️⃣ &lt;strong&gt;Form / Request এ Token কীভাবে যায়?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Blade form&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;form method="POST"&amp;gt;
    @csrf
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;HTML এ রূপ নেয়:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;input type="hidden" name="_token" value="random_string"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;AJAX Request&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;headers: {
  'X-CSRF-TOKEN': document
    .querySelector('meta[name="csrf-token"]')
    .getAttribute('content')
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5️⃣ &lt;strong&gt;CSRF Validation কীভাবে হয়?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 Validation হয় এই middleware দিয়ে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;App\Http\Middleware\VerifyCsrfToken
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Validation Flow:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1️⃣ Request আসে&lt;br&gt;
2️⃣ Middleware &lt;code&gt;_token বা X-CSRF-TOKEN&lt;/code&gt; পড়ে&lt;br&gt;
3️⃣ Session এর &lt;code&gt;_token&lt;/code&gt; এর সাথে compare করে&lt;br&gt;
4️⃣ Match হলে → request allow&lt;br&gt;
5️⃣ Match না হলে → &lt;strong&gt;419 Page Expired&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;6️⃣ &lt;strong&gt;CSRF Check কোন Request এ হয়?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP Method CSRF
GET         ❌
HEAD            ❌
OPTIONS         ❌
POST            ✅
PUT         ✅
PATCH           ✅
DELETE          ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;7️⃣ &lt;strong&gt;Token Regenerate কবে হয়?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User logout করলে&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;session()-&amp;gt;regenerateToken()&lt;/code&gt; call করলে&lt;/li&gt;
&lt;li&gt;New session তৈরি হলে
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;session()-&amp;gt;regenerateToken();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;8️⃣ &lt;strong&gt;CSRF Skip করা যায়?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;protected $except = [
    'webhook/*',
];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠️ শুধু trusted route এ&lt;/p&gt;




&lt;p&gt;🧠 &lt;strong&gt;Interview-Ready Summary:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Laravel CSRF token session start হওয়ার সময় generate হয়, session-এ &lt;code&gt;_token&lt;/code&gt; হিসেবে store থাকে, database এ save হয় না, এবং &lt;code&gt;VerifyCsrfToken&lt;/code&gt;middleware request token এর সাথে session token match করে validate করে।&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;🔥 &lt;strong&gt;Real-Life Analogy:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CSRF token =&lt;br&gt;
🎟️ &lt;strong&gt;Cinema ticket stub&lt;/strong&gt;&lt;br&gt;
Ticket ছাড়া ভিতরে ঢোকা যাবে না—even যদি তুমি বাইরে থেকে ডাকো।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Q:6:&lt;/em&gt;&lt;/strong&gt; আমার ২টা টেবিলের ডাটা জয়েন করে দেখাইতে হবে।কিভাবে পারফরম্যান্স অপ্টিমাইজড করে দেখাইতে পারি? &amp;amp; O(log n) আনতে পারি?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer&lt;/strong&gt;: &lt;br&gt;
1️⃣ &lt;strong&gt;বাস্তবতা আগে বুঝি (Important Truth)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;SQL JOIN কখনোই pure O(log n) হয় না পুরো result-এর জন্য&lt;/strong&gt;&lt;br&gt;
কিন্তু ✔ &lt;strong&gt;lookup / filtering অংশ O(log n) করা যায় index দিয়ে।&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 Interview-style কথা:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“We can achieve O(log n) lookup using proper indexing, but overall join result depends on dataset size.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;2️⃣ &lt;strong&gt;ধরো ২টা টেবিল&lt;/strong&gt;&lt;br&gt;
users&lt;br&gt;
|id | name&lt;br&gt;
orders&lt;/p&gt;

&lt;p&gt;| id | user_id | amount |&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT u.name, o.amount
FROM users u
JOIN orders o ON o.user_id = u.id
WHERE u.id = 10;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3️⃣ 🚀 &lt;strong&gt;Performance Optimization (MOST IMPORTANT)&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;1. Join Column-এ Index (Mandatory)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ALTER TABLE users ADD PRIMARY KEY (id);
ALTER TABLE orders ADD INDEX idx_user_id (user_id);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 এখন lookup হবে &lt;strong&gt;B-Tree index → O(log n)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;2. Filter FIRST, Join LATER&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;❌ খারাপ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT *
FROM users u
JOIN orders o ON o.user_id = u.id;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✔ ভালো:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT u.name, o.amount
FROM users u
JOIN orders o ON o.user_id = u.id
WHERE u.id = 10;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 ছোট dataset join হয়&lt;/p&gt;




&lt;p&gt;✅ &lt;strong&gt;3. Select only required columns&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT u.name, o.amount
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;❌ &lt;code&gt;SELECT *&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;4. Proper Join Type ব্যবহার&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;Situation&lt;/code&gt;              &lt;code&gt;Join&lt;/code&gt;&lt;br&gt;
Mandatory relation  INNER JOIN&lt;br&gt;
Optional relation   LEFT JOIN&lt;/p&gt;

&lt;p&gt;INNER JOIN fast হয়&lt;/p&gt;



&lt;p&gt;✅ &lt;strong&gt;5. Covering Index (Advanced)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE INDEX idx_orders_user_amount
ON orders(user_id, amount);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 DB table read না করেই index থেকে data পায়&lt;/p&gt;

&lt;p&gt;4️⃣ &lt;strong&gt;Laravel Level Optimization&lt;/strong&gt;&lt;br&gt;
❌ &lt;strong&gt;N+1 Problem (Worst)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$users = User::all();
foreach ($users as $user) {
   $user-&amp;gt;orders;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Eager Loading&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User::with('orders:id,user_id,amount')
    -&amp;gt;where('id', 10)
    -&amp;gt;get();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Join Instead of Eloquent Relation (Heavy data হলে)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DB::table('users')
    -&amp;gt;join('orders', 'orders.user_id', '=', 'users.id')
    -&amp;gt;where('users.id', 10)
    -&amp;gt;select('users.name', 'orders.amount')
    -&amp;gt;get();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5️⃣ &lt;strong&gt;EXPLAIN ব্যবহার করো (Very Important)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EXPLAIN SELECT ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check করো:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;type&lt;/code&gt; → ref / eq_ref (BEST)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;key&lt;/code&gt; → index used&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rows&lt;/code&gt; → low number&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;6️⃣ &lt;strong&gt;Cache Layer (Real World)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cache::remember('user_orders_10', 60, function () {
   return DB::table(...)
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Read-heavy হলে massive boost&lt;/p&gt;

&lt;p&gt;7️⃣ &lt;strong&gt;O(log n) Practical Explanation&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Layer&lt;/strong&gt;            &lt;strong&gt;Complexity&lt;/strong&gt;&lt;br&gt;
Index lookup              O(log n)&lt;br&gt;
Join result build     O(k)&lt;br&gt;
Network transfer      O(k)&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Lookup O(log n), Output O(k)&lt;/strong&gt; ← এটাই বাস্তব&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;Interview-Ready Final Answer&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Proper indexing on join &amp;amp; filter columns ensures O(log n) lookup. Using selective WHERE, INNER JOIN, covering index, eager loading / join query, and EXPLAIN ensures optimized join performance. Full join output cannot be pure O(log n), but lookup can be.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;🏁 &lt;strong&gt;Checklist (Use this in real project)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ Indexed join column&lt;br&gt;
✅ Filter early&lt;br&gt;
✅ Select only required columns&lt;br&gt;
✅ Avoid N+1&lt;br&gt;
✅ Use EXPLAIN&lt;br&gt;
✅ Cache read-heavy join&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Q_7:&lt;/em&gt;&lt;/strong&gt; ১. আমার ২ টা আলাদা আলাদা ডাটাবেইজ আছে, দুই ডাটাবেইজ থেকে জয়েন করে ডাটা আনতে হবে, কিভাবে করতে পারি?? &lt;br&gt;
২. মাইক্রোসার্ভিস কি &amp;amp; কেন ব্যবহার করা হয়? &lt;br&gt;
১ নং প্রশ্নের সাথে ২ নং প্রশ্নের সম্পর্ক কি? &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer&lt;/strong&gt;: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;দুইটা আলাদা Database থেকে JOIN কিভাবে করবো?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;এখানে &lt;strong&gt;২টা আলাদা scenario&lt;/strong&gt; আছে—এগুলো আলাদা করে বুঝতে হবে।&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;Case–1: একই DB Server, আলাদা Database (MySQL same server)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ধরা যাক:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database-1 → &lt;code&gt;user_db&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Database-2 → &lt;code&gt;order_db&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;দুটোই &lt;strong&gt;একই MySQL server&lt;/strong&gt;-এ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 তখন &lt;strong&gt;cross-database JOIN সম্ভব।&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQL Example&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT u.name, o.amount
FROM user_db.users u
JOIN order_db.orders o ON o.user_id = u.id;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✔ Works&lt;br&gt;
✔ Fast (index থাকলে)&lt;br&gt;
✔ Production-safe (monolith system)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Laravel Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DB::select("
  SELECT u.name, o.amount
  FROM user_db.users u
  JOIN order_db.orders o ON o.user_id = u.id
");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 &lt;strong&gt;শর্ত&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Same DB host&lt;/li&gt;
&lt;li&gt;Same DB engine (MySQL ↔ MySQL)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ &lt;strong&gt;Case–2: আলাদা DB Server (Different Host / Microservice DB)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ধরা যাক:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User DB → Server A&lt;/li&gt;
&lt;li&gt;Order DB → Server B&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;SQL JOIN অসম্ভব&lt;/strong&gt; ❌&lt;/p&gt;

&lt;p&gt;কারণ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database engine একে অপরকে চেনে না&lt;/li&gt;
&lt;li&gt;Network boundary আছে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Solution (Application-level JOIN)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$users = DB::connection('user_db')
            -&amp;gt;table('users')
            -&amp;gt;get()
            -&amp;gt;keyBy('id');

$orders = DB::connection('order_db')
            -&amp;gt;table('orders')
            -&amp;gt;get();

$result = $orders-&amp;gt;map(function ($order) use ($users) {
    return [
        'user' =&amp;gt; $users[$order-&amp;gt;user_id]-&amp;gt;name ?? null,
        'amount' =&amp;gt; $order-&amp;gt;amount
    ];
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠️ বড় data হলে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pagination&lt;/li&gt;
&lt;li&gt;Filter first&lt;/li&gt;
&lt;li&gt;Cache&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;2. Microservice কী &amp;amp; কেন ব্যবহার করা হয়?&lt;/strong&gt;&lt;br&gt;
🔹 &lt;strong&gt;Microservice কী?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Microservice হলো architecture যেখানে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;বড় application কে &lt;strong&gt;ছোট ছোট independent service&lt;/strong&gt; এ ভাগ করা হয়&lt;/li&gt;
&lt;li&gt;&lt;p&gt;প্রতিটা service এর:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;নিজস্ব codebase&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;নিজস্ব database&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;আলাদা deploy&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User Service → &lt;strong&gt;user_db&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Order Service → &lt;strong&gt;order_db&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Payment Service → &lt;strong&gt;payment_db&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;কেন Microservice ব্যবহার করা হয়?&lt;/strong&gt;&lt;br&gt;
কারণ                                    ব্যাখ্যা&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scalability                     আলাদা service আলাদা scale
Fault isolation                    এক service down → সব down না
Team independence              আলাদা team আলাদা service
Tech flexibility               Node + Go + PHP mix
Fast deployment                    Independent release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;১ নং প্রশ্নের সাথে ২ নং প্রশ্নের সম্পর্ক কী?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;👉 &lt;strong&gt;এইটাই সবচেয়ে গুরুত্বপূর্ণ অংশ&lt;/strong&gt; 👇&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Direct Relationship&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Situation                 Join possible?
Monolith (same DB server)   ✅ Yes
Microservice (separate DB)  ❌ No
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Microservice Rule&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ &lt;strong&gt;Never JOIN across service databases&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;🧠 &lt;strong&gt;তাহলে Microservice এ ডাটা কিভাবে আনে?&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;API Composition (Most common)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
 ↓
Backend API
 ↓
User Service API
 ↓
Order Service API
 ↓
Merge data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$user = Http::get('user-service/api/users/10');
$orders = Http::get('order-service/api/orders?user_id=10');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Join হয় code level-এ, DB level-এ না&lt;/p&gt;




&lt;p&gt;✅ &lt;strong&gt;Event-Driven (Advanced)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Order created&lt;/li&gt;
&lt;li&gt;Event publish&lt;/li&gt;
&lt;li&gt;User service local cache update&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Data Duplication (Read model)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read-optimized table&lt;/li&gt;
&lt;li&gt;CQRS pattern&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🧠 &lt;strong&gt;Interview-Ready Final Answer:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Same DB server হলে cross-database JOIN করা যায়।&lt;br&gt;
Microservice architecture-এ প্রতিটা service এর আলাদা database থাকে, তাই DB-level JOIN করা যায় না; data API বা event দিয়ে aggregate করতে হয়।&lt;br&gt;
এই কারণেই microservice ব্যবহার করলে join strategy সম্পূর্ণ বদলে যায়।&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;🏁 &lt;strong&gt;Summary (এক লাইনে)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Monolith → DB JOIN&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microservice → API / Event JOIN&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Q_8:&lt;/em&gt;&lt;/strong&gt;  Rate limiting এর জন্য কি কি ডাটা নিতে হয়? ইউজার স্পেসিফিকভাবে rate limit করবো কিভাবে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer&lt;/strong&gt;: &lt;br&gt;
1️⃣ &lt;strong&gt;Rate Limiting বলতে কী বোঝায়?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rate Limiting মানে হলো—&lt;br&gt;
👉 নির্দিষ্ট সময়ের মধ্যে &lt;strong&gt;কতবার request করা যাবে তার সীমা নির্ধারণ করা।&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;উদাহরণ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 মিনিটে সর্বোচ্চ 60 request&lt;/li&gt;
&lt;li&gt;1 ঘণ্টায় সর্বোচ্চ 1000 request&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;উদ্দেশ্য:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DDoS / brute-force attack ঠেকানো&lt;/li&gt;
&lt;li&gt;Server overload রোধ করা&lt;/li&gt;
&lt;li&gt;Fair usage নিশ্চিত করা&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2️⃣ &lt;strong&gt;Rate Limiting করতে কী কী ডাটা লাগে?&lt;/strong&gt;&lt;br&gt;
🔑 &lt;strong&gt;Minimum Required Data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rate limit করতে সাধারণত এই ডাটাগুলো লাগে:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fed4nym1sas36588ft43x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fed4nym1sas36588ft43x.png" alt=" " width="800" height="223"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;🔍 &lt;strong&gt;Identifier হিসেবে কী ব্যবহার করা যায়?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IP Address&lt;/li&gt;
&lt;li&gt;User ID&lt;/li&gt;
&lt;li&gt;API Token&lt;/li&gt;
&lt;li&gt;Email / Username&lt;/li&gt;
&lt;li&gt;Device ID (advanced)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3️⃣ &lt;strong&gt;User-specific Rate Limiting কিভাবে করবো?&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Scenario–1: Logged-in User (Best &amp;amp; Accurate)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;User ID&lt;/strong&gt; ব্যবহার করাই সবচেয়ে ভালো&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Laravel Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RateLimiter::for('user-api', function (Request $request) {
    return Limit::perMinute(60)-&amp;gt;by(
        optional($request-&amp;gt;user())-&amp;gt;id ?: $request-&amp;gt;ip()
    );
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✔ Login থাকলে → user_id&lt;br&gt;
✔ Login না থাকলে → IP fallback&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Route এ apply&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Route::middleware('throttle:user-api')
    -&amp;gt;get('/profile', fn () =&amp;gt; 'ok');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Scenario–2: API Token based (Mobile / Public API)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Limit::perMinute(100)-&amp;gt;by($request-&amp;gt;header('X-API-TOKEN'));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✔ Token-based control&lt;br&gt;
✔ Scalable&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Scenario–3: IP-based (Guest User)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Limit::perMinute(30)-&amp;gt;by($request-&amp;gt;ip());
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠️ NAT / shared IP হলে inaccurate হতে পারে&lt;/p&gt;

&lt;p&gt;4️⃣ &lt;strong&gt;Rate Limit ডাটা কোথায় store হয়?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel defaultভাবে ব্যবহার করে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cache system&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3aoyf9n0pv60e8uwi1k4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3aoyf9n0pv60e8uwi1k4.png" alt=" " width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 Production-এ &lt;strong&gt;Redis strongly recommended&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;5️⃣ &lt;strong&gt;Rate Limiting Algorithm (Simple View)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel internally ব্যবহার করে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fixed Window / Sliding Window counter&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;key = user_id + route
count++
if count &amp;gt; limit → block
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;6️⃣ &lt;strong&gt;Different Rate Limit per User Role (Advanced)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RateLimiter::for('api', function (Request $request) {
    if ($request-&amp;gt;user()?-&amp;gt;is_admin) {
        return Limit::none();
    }

    return Limit::perMinute(60)-&amp;gt;by($request-&amp;gt;user()-&amp;gt;id);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✔ Admin unlimited&lt;br&gt;
✔ Normal user limited&lt;/p&gt;

&lt;p&gt;7️⃣ &lt;strong&gt;Response Headers (Client-side info)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel auto পাঠায়:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;X-RateLimit-Limit: 60
X-RateLimit-Remaining: 12
Retry-After: 30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Client বুঝতে পারে কখন আবার request করবে&lt;/p&gt;

&lt;p&gt;8️⃣ &lt;strong&gt;Interview-Ready Summary&lt;/strong&gt; 🧠&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Rate limiting requires an identifier (user ID / IP / token), a time window, request count, and a fast storage like Redis.&lt;br&gt;
User-specific rate limiting is best implemented using authenticated user ID with cache-backed counters.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>situtionrelatedqa</category>
    </item>
    <item>
      <title>Git, GitHub, PR &amp; Version Control Interview Questions in Bangla</title>
      <dc:creator>Ruhul Amin Sujon</dc:creator>
      <pubDate>Wed, 28 Jan 2026 18:57:03 +0000</pubDate>
      <link>https://dev.to/ruhul_aminsujon_f65b3678/git-github-pr-version-control-interview-questions-in-bangla-1n1p</link>
      <guid>https://dev.to/ruhul_aminsujon_f65b3678/git-github-pr-version-control-interview-questions-in-bangla-1n1p</guid>
      <description>&lt;h1&gt;
  
  
  🔥 Git, GitHub, PR &amp;amp; Version Control – Interview Questions (Bangla)
&lt;/h1&gt;




&lt;h2&gt;
  
  
  🔸 Version Control Basics
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন ১&lt;/strong&gt;: Version Control System (VCS) কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
Version Control System এমন একটি সিস্টেম যা কোডের প্রতিটি পরিবর্তনের ইতিহাস সংরক্ষণ করে এবং একাধিক ডেভেলপারকে একসাথে কাজ করতে সাহায্য করে।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ২&lt;/strong&gt;: Version control কেন দরকার?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;কোড পরিবর্তনের ইতিহাস সংরক্ষণ&lt;/li&gt;
&lt;li&gt;ভুল হলে আগের ভার্সনে ফিরে যাওয়া&lt;/li&gt;
&lt;li&gt;একাধিক ডেভেলপার একসাথে কাজ করা&lt;/li&gt;
&lt;li&gt;Conflict সহজে ম্যানেজ করা&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ৩&lt;/strong&gt;: Version control ছাড়া কী সমস্যা হয়?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;কোড overwrite হয়ে যেতে পারে&lt;/li&gt;
&lt;li&gt;কে কী পরিবর্তন করেছে বোঝা যায় না&lt;/li&gt;
&lt;li&gt;Backup বা rollback সম্ভব হয় না&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ৪&lt;/strong&gt;: Centralized ও Distributed VCS এর পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc83xj5y63rukb0c1101u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc83xj5y63rukb0c1101u.png" alt=" " width="800" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Centralized: SVN&lt;/li&gt;
&lt;li&gt;Distributed: Git&lt;/li&gt;
&lt;li&gt;Git এ সম্পূর্ণ repository লোকাল মেশিনে থাকে&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ৫&lt;/strong&gt;: Git কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
Git হলো একটি Distributed Version Control System যা Linus Torvalds তৈরি করেছেন।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ৬&lt;/strong&gt;: Git আর GitHub কি এক জিনিস?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
না।&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Git → version control tool&lt;/li&gt;
&lt;li&gt;GitHub → Git repository hosting platform&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ৭&lt;/strong&gt;: GitHub ছাড়া কি Git ব্যবহার করা যায়?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
হ্যাঁ, সম্পূর্ণ লোকালভাবেও Git ব্যবহার করা যায়।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ৮&lt;/strong&gt;: Repository কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
Repository হলো একটি প্রজেক্টের সম্পূর্ণ source code ও commit history সংরক্ষণের জায়গা।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ৯&lt;/strong&gt;: Local ও Remote repository কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local → নিজের কম্পিউটারে&lt;/li&gt;
&lt;li&gt;Remote → GitHub / GitLab এ&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ১০&lt;/strong&gt;: Git workflow কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
কোড লেখা → commit → push → pull request → review → merge&lt;/p&gt;


&lt;h2&gt;
  
  
  🔸 Basic Git Commands
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন ১১&lt;/strong&gt;: &lt;code&gt;git init&lt;/code&gt; কী করে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
নতুন Git repository তৈরি করে।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ১২&lt;/strong&gt;: &lt;code&gt;git clone&lt;/code&gt; কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
Remote repository লোকাল মেশিনে কপি করে।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ১৩&lt;/strong&gt;: &lt;code&gt;git status&lt;/code&gt; কী দেখায়?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
Working directory ও staging area এর অবস্থা দেখায়।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ১৪&lt;/strong&gt;: &lt;code&gt;git add&lt;/code&gt; কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
ফাইল staging area-তে পাঠায়।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ১৫&lt;/strong&gt;: &lt;code&gt;git commit&lt;/code&gt; কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
Staged পরিবর্তন স্থায়ীভাবে history-তে সংরক্ষণ করে।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ১৬&lt;/strong&gt;: ভালো commit message কেমন হওয়া উচিত?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ছোট&lt;/li&gt;
&lt;li&gt;পরিষ্কার&lt;/li&gt;
&lt;li&gt;অর্থবোধক&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;উদাহরণ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fix: login validation issue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;প্রশ্ন ১৭&lt;/strong&gt;: &lt;code&gt;git log&lt;/code&gt; কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
সব commit history দেখায়।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ১৮&lt;/strong&gt;: &lt;code&gt;git diff&lt;/code&gt; কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
বর্তমান পরিবর্তন ও আগের commit এর পার্থক্য দেখায়।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ১৯&lt;/strong&gt;: &lt;code&gt;git reset&lt;/code&gt; কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
Commit বা staging বাতিল করতে ব্যবহৃত হয়।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ২০&lt;/strong&gt;: &lt;code&gt;git revert&lt;/code&gt; কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
নতুন commit তৈরি করে আগের commit undo করে।&lt;/p&gt;


&lt;h2&gt;
  
  
  🔸 Branch &amp;amp; Merge
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন ২১&lt;/strong&gt;: Branch কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
Branch হলো মূল কোড থেকে আলাদা একটি development line।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ২২&lt;/strong&gt;: Branch কেন দরকার?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Feature আলাদা করে কাজ করা&lt;/li&gt;
&lt;li&gt;Main branch নিরাপদ রাখা&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ২৩&lt;/strong&gt;: Default branch কোনটি?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
বর্তমানে &lt;code&gt;main&lt;/code&gt;।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ২৪&lt;/strong&gt;: &lt;code&gt;git checkout -b&lt;/code&gt; কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
নতুন branch তৈরি ও switch করে।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ২৫&lt;/strong&gt;: Merge কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
এক branch-এর কোড অন্য branch-এ যুক্ত করা।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ২৬&lt;/strong&gt;: Merge conflict কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
একই লাইনে একাধিক পরিবর্তন হলে conflict হয়।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ২৭&lt;/strong&gt;: Conflict কীভাবে resolve করা হয়?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ম্যানুয়ালি কোড ঠিক করা&lt;/li&gt;
&lt;li&gt;পুনরায় commit করা&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ২৮&lt;/strong&gt;: Fast-forward merge কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
যখন main branch এ নতুন commit না থাকে।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ২৯&lt;/strong&gt;: Rebase কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
Commit history পরিষ্কার করার পদ্ধতি।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ৩০&lt;/strong&gt;: Cherry-pick কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
নির্দিষ্ট একটি commit অন্য branch-এ নেওয়া।&lt;/p&gt;


&lt;h2&gt;
  
  
  🔸 GitHub &amp;amp; Pull Request
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন ৩১&lt;/strong&gt;: Remote repository কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
GitHub বা GitLab এ থাকা repository।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ৩২&lt;/strong&gt;: &lt;code&gt;origin&lt;/code&gt; কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
Remote repository এর default নাম।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ৩৩&lt;/strong&gt;: &lt;code&gt;git push&lt;/code&gt; কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
Local commit remote এ পাঠায়।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ৩৪&lt;/strong&gt;: &lt;code&gt;git pull&lt;/code&gt; কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
Remote পরিবর্তন নিয়ে এসে merge করে।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ৩৫&lt;/strong&gt;: &lt;code&gt;git fetch&lt;/code&gt; ও &lt;code&gt;git pull&lt;/code&gt; পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fetch → শুধু ডাটা আনে&lt;/li&gt;
&lt;li&gt;pull → আনে + merge করে&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ৩৬&lt;/strong&gt;: Fork কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
অন্যের repository নিজের GitHub অ্যাকাউন্টে কপি করা।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ৩৭&lt;/strong&gt;: Fork কেন দরকার?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
Open-source contribution এর জন্য।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ৩৮&lt;/strong&gt;: Pull Request (PR) কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
এক branch-এর পরিবর্তন অন্য branch-এ যুক্ত করার অনুরোধ।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ৩৯&lt;/strong&gt;: PR কেন দরকার?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code review&lt;/li&gt;
&lt;li&gt;Bug ধরা&lt;/li&gt;
&lt;li&gt;Team approval&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ৪০&lt;/strong&gt;: PR workflow কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feature → push → PR → review → merge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;প্রশ্ন ৪১&lt;/strong&gt;: Code review কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
অন্য ডেভেলপার দ্বারা কোড যাচাই।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ৪২&lt;/strong&gt;: PR merge এর ধরন কয়টি?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Merge commit&lt;/li&gt;
&lt;li&gt;Squash merge&lt;/li&gt;
&lt;li&gt;Rebase merge&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ৪৩&lt;/strong&gt;: Squash merge কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
একাধিক commit একটিতে পরিণত করা।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ৪৪&lt;/strong&gt;: Draft PR কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
কাজ চলমান অবস্থায় তৈরি করা PR।&lt;/p&gt;


&lt;h2&gt;
  
  
  🔸 Laravel + Git
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন ৪৫&lt;/strong&gt;: &lt;code&gt;.gitignore&lt;/code&gt; কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
যেসব ফাইল Git track করবে না সেগুলোর তালিকা।&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন ৪৬&lt;/strong&gt;: Laravel এ কোন ফাইল gitignore করা হয়?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.env
/vendor
/node_modules
/storage/*.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;প্রশ্ন ৪৭&lt;/strong&gt;: &lt;code&gt;.env&lt;/code&gt; ফাইল Git এ রাখা হয় না কেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
এতে database password ও secret key থাকে।&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;প্রশ্ন ৪৮&lt;/strong&gt;: Git stash কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
অসম্পূর্ণ কাজ সাময়িকভাবে লুকিয়ে রাখা।&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;প্রশ্ন ৪৯&lt;/strong&gt;: &lt;code&gt;git stash pop&lt;/code&gt; কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
Stash করা কাজ ফিরিয়ে আনে।&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;প্রশ্ন ৫০&lt;/strong&gt;: Git tag কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
Release version চিহ্নিত করতে ব্যবহৃত হয়।&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;প্রশ্ন ৫১&lt;/strong&gt;: Semantic versioning কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
MAJOR.MINOR.PATCH&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;প্রশ্ন ৫২&lt;/strong&gt;: Git hooks কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
Commit বা push এর আগে অটোমেটিক script চালানো।&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;প্রশ্ন ৫৩&lt;/strong&gt;: Hotfix branch কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
Production bug দ্রুত ঠিক করার branch।&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;প্রশ্ন ৫৪&lt;/strong&gt;: Feature branch কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
নতুন feature ডেভেলপ করার জন্য branch।&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;প্রশ্ন ৫৫&lt;/strong&gt;: Professional Git workflow কেমন হওয়া উচিত?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;main → production&lt;/li&gt;
&lt;li&gt;develop → testing&lt;/li&gt;
&lt;li&gt;feature/* → new feature&lt;/li&gt;
&lt;li&gt;hotfix/* → urgent bug&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>git</category>
      <category>github</category>
      <category>laravel</category>
      <category>interview</category>
    </item>
    <item>
      <title>AS API Code Example</title>
      <dc:creator>Ruhul Amin Sujon</dc:creator>
      <pubDate>Wed, 02 Jul 2025 11:35:23 +0000</pubDate>
      <link>https://dev.to/ruhul_aminsujon_f65b3678/as-api-code-example-23g7</link>
      <guid>https://dev.to/ruhul_aminsujon_f65b3678/as-api-code-example-23g7</guid>
      <description>&lt;p&gt;&lt;strong&gt;Controller&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\Tv;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;

class TvController extends Controller
{
    public function index()
    {
        try {
            $tvs = Tv::where('status', 1)-&amp;gt;get();

            return response()-&amp;gt;json([
                'status' =&amp;gt; true,
                'statusCode' =&amp;gt; 200,
                'message' =&amp;gt; 'TV list retrieved successfully',
                'data' =&amp;gt; $tvs
            ]);
        } catch (Exception $e) {

            // Log the error
            Log::error('Error in retrieving TV: ', [
                'message' =&amp;gt; $e-&amp;gt;getMessage(),
                'code' =&amp;gt; $e-&amp;gt;getCode(),
                'line' =&amp;gt; $e-&amp;gt;getLine(),
                'trace' =&amp;gt; $e-&amp;gt;getTraceAsString()
            ]);

            return response()-&amp;gt;json([
                'status' =&amp;gt; false,
                'statusCode' =&amp;gt; 500,
                'message' =&amp;gt; 'Something went wrong!!!',
                'data' =&amp;gt; []
            ], 500);
        }
    }

    public function store(Request $request)
    {
        $validator = Validator::make($request-&amp;gt;all(), [
            'name' =&amp;gt; 'required|string',
            'channel_id' =&amp;gt; 'required|string',
            'file' =&amp;gt; 'required|file|image:jpg|image:png',
            'status' =&amp;gt; 'nullable|in:0,1',
        ]);

        if ($validator-&amp;gt;fails()) {
            return response()-&amp;gt;json([
                'status' =&amp;gt; false,
                'statusCode' =&amp;gt; 422,
                'message' =&amp;gt; 'The given data was invalid',
                'data' =&amp;gt; $validator-&amp;gt;errors()
            ], 422);
        }

        try {
            // Handle file upload
            if ($request-&amp;gt;hasFile('file')) {
                $filePath = $this-&amp;gt;storeFile($request-&amp;gt;file('file'));
                $img_url = $filePath ?? '';
            }

            $tv = Tv::create([
                'name' =&amp;gt; $request-&amp;gt;name,
                'channel_id' =&amp;gt; $request-&amp;gt;channel_id,
                'img_url' =&amp;gt; $img_url,
                'status' =&amp;gt; 1,
            ]);

            return response()-&amp;gt;json([
                'status' =&amp;gt; true,
                'statusCode' =&amp;gt; 201,
                'message' =&amp;gt; 'TV created successfully',
                'data' =&amp;gt; $tv
            ], 201);
        } catch (Exception $e) {

            // Log the error
            Log::error('Error in storing TV: ', [
                'message' =&amp;gt; $e-&amp;gt;getMessage(),
                'code' =&amp;gt; $e-&amp;gt;getCode(),
                'line' =&amp;gt; $e-&amp;gt;getLine(),
                'trace' =&amp;gt; $e-&amp;gt;getTraceAsString()
            ]);

            return response()-&amp;gt;json([
                'status' =&amp;gt; false,
                'statusCode' =&amp;gt; 500,
                'message' =&amp;gt; 'Something went wrong!!!',
                'data' =&amp;gt; []
            ], 500);
        }
    }
    public function show($id)
    {
        //
    }
    public function update(Request $request)
    {
        $validator = Validator::make($request-&amp;gt;all(), [
            'id' =&amp;gt; 'required|exists:tvs,id',
            'name' =&amp;gt; 'nullable|string',
            'channel_id' =&amp;gt; 'nullable|string',
            'file' =&amp;gt; 'nullable|file|image:jpg|image:png|image:jpeg',
            'status' =&amp;gt; 'nullable|in:0,1',
        ]);

        if ($validator-&amp;gt;fails()) {
            return response()-&amp;gt;json([
                'status' =&amp;gt; false,
                'statusCode' =&amp;gt; 422,
                'message' =&amp;gt; 'The given data was invalid',
                'data' =&amp;gt; $validator-&amp;gt;errors()
            ], 422);
        }

        try {
            $tv = Tv::findOrFail($request-&amp;gt;id);

            $requestData = $request-&amp;gt;except(['file', 'id']);
            $requestData['name'] = $requestData['name'] ?? $tv-&amp;gt;name;
            $requestData['channel_id'] = $requestData['channel_id'] ?? $tv-&amp;gt;title;
            $requestData['status'] = $requestData['status'] ?? $tv-&amp;gt;singer_name;
            $requestData['img_url'] = $tv-&amp;gt;img_url;
            $requestData['updated_at'] = now();

            // Handle file upload
            if ($request-&amp;gt;hasFile('file')) {
                $filePath = $this-&amp;gt;updateFile($request-&amp;gt;file('file'), $tv);
                $requestData['img_url'] = $filePath ?? '';
            }

            $tv-&amp;gt;update($requestData);

            return response()-&amp;gt;json([
                'status' =&amp;gt; true,
                'statusCode' =&amp;gt; 200,
                'message' =&amp;gt; 'TV updated successfully',
                'data' =&amp;gt; $tv
            ]);
        } catch (Exception $e) {

            // Log the error
            Log::error('Error in updating TV: ', [
                'message' =&amp;gt; $e-&amp;gt;getMessage(),
                'code' =&amp;gt; $e-&amp;gt;getCode(),
                'line' =&amp;gt; $e-&amp;gt;getLine(),
                'trace' =&amp;gt; $e-&amp;gt;getTraceAsString()
            ]);

            return response()-&amp;gt;json([
                'status' =&amp;gt; false,
                'statusCode' =&amp;gt; 500,
                'message' =&amp;gt; 'Something went wrong!!!',
                'data' =&amp;gt; []
            ], 500);
        }
    }
    public function destroy($id)
    {
        //
    }

    private function storeFile($file)
    {
        // Define the directory path
        $filePath = 'files/music/mp3';
        $directory = public_path($filePath);

        // Ensure the directory exists
        if (!file_exists($directory)) {
            mkdir($directory, 0777, true);
        }

        // Generate a unique file name
        $fileName = uniqid('music_', true) . '.' . $file-&amp;gt;getClientOriginalExtension();

        // Move the file to the destination directory
        $file-&amp;gt;move($directory, $fileName);

        // path &amp;amp; file name in the database
        # $path = $filePath . '/' . $fileName;
        $path = $fileName;
        return $path;
    }
    public function getMusic($filename)
    {
        try {
            $path = public_path('files/music/mp3/' . $filename);

            if (!file_exists($path)) {
                return $this-&amp;gt;sendResponse(false, '404, File not found.', []);
            }

            return response()-&amp;gt;file($path);
        } catch (Exception $e) {

            // Log the error
            Log::error('Error in get File: ', [
                'message' =&amp;gt; $e-&amp;gt;getMessage(),
                'code' =&amp;gt; $e-&amp;gt;getCode(),
                'line' =&amp;gt; $e-&amp;gt;getLine(),
                'trace' =&amp;gt; $e-&amp;gt;getTraceAsString()
            ]);

            return $this-&amp;gt;sendResponse(false, 'Something went wrong!!!', [], 500);
        }
    }
    private function updateFile($file, $data)
    {
        // Define the directory path
        $filePath = 'files/music/mp3';
        $directory = public_path($filePath);

        // Ensure the directory exists
        if (!file_exists($directory)) {
            mkdir($directory, 0777, true);
        }

        // Generate a unique file name
        $fileName = uniqid('music_', true) . '.' . $file-&amp;gt;getClientOriginalExtension();

        // Delete the old file if it exists
        $this-&amp;gt;deleteOldFile($data);

        // Move the new file to the destination directory
        $file-&amp;gt;move($directory, $fileName);

        // Store path &amp;amp; file name in the database
        # $path = $filePath . '/' . $fileName;
        $path = $fileName;
        return $path;
    }
    private function deleteOldFile($data)
    {
        if (!empty($data-&amp;gt;img_url)) {
            $filePath = 'files/music/mp3';
            $directory = $data-&amp;gt;img_url;
            $path = $filePath . '/' . $directory;

            $oldFilePath = public_path($path); // Use without prepending $filePath
            if (file_exists($oldFilePath)) {
                unlink($oldFilePath); // Delete the old file
                return true;
            } else {
                Log::warning('Old file not found for deletion', ['path' =&amp;gt; $oldFilePath]);
                return false;
            }
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;আপনি নিচের মতো একটি Laravel রুট তৈরি করে /clear-cache এ গিয়ে cache, config, route এবং view clear করতে পারেন&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Route;

Route::get('/clear-cache', function () {
    Artisan::call('cache:clear');
    Artisan::call('config:clear');
    Artisan::call('route:clear');
    Artisan::call('view:clear');

    return 'All caches (config, route, view, application) have been cleared!';
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;Previous one file store with get full path&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    private function storeFile($file)
    {
        // Define the directory path
        // TODO: Change path if needed
        $filePath = 'files/images/country'; # change path if needed
        $directory = public_path($filePath);

        // Ensure the directory exists
        if (!file_exists($directory)) {
            mkdir($directory, 0777, true);
        }

        // Generate a unique file name
        // TODO: Change path if needed
        $fileName = uniqid('flag_', true) . '.' . $file-&amp;gt;getClientOriginalExtension();

        // Move the file to the destination directory
        $file-&amp;gt;move($directory, $fileName);

        // path &amp;amp; file name in the database
        $path = $filePath . '/' . $fileName;
        return $path;
    }
    private function updateFile($file, $data)
    {
        // Define the directory path
        // TODO: Change path if needed
        $filePath = 'files/images/country'; # change path if needed
        $directory = public_path($filePath);

        // Ensure the directory exists
        if (!file_exists($directory)) {
            mkdir($directory, 0777, true);
        }

        // Generate a unique file name
        // TODO: Change path following storeFile function
        $fileName = uniqid('flag_', true) . '.' . $file-&amp;gt;getClientOriginalExtension();

        // Delete the old file if it exists
        $this-&amp;gt;deleteOldFile($data);

        // Move the new file to the destination directory
        $file-&amp;gt;move($directory, $fileName);

        // Store path &amp;amp; file name in the database
        $path = $filePath . '/' . $fileName;
        return $path;
    }
    private function deleteOldFile($data)
    {
        // TODO: ensure from database
        if (!empty($data-&amp;gt;flag)) { # ensure from database
            $oldFilePath = public_path($data-&amp;gt;flag); // Use without prepending $filePath
            if (file_exists($oldFilePath)) {
                unlink($oldFilePath); // Delete the old file
                return true;
            } else {
                Log::warning('Old file not found for deletion', ['path' =&amp;gt; $oldFilePath]);
                return false;
              }
          }
      }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;Repository:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

namespace App\Modules\Products\Repositories;

use App\Modules\Products\Models\Product;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Exception;

class ProductRepository
{
    public function all()
    {
        $data = Product::latest()-&amp;gt;get();

        return $data;
    }
    public function store(array $data, $userId)
    {
        DB::beginTransaction();
        try {
            $data['created_by'] = $userId;
            $data['updated_by'] = null;

            // Correct way to check file
            if (isset($data['photo']) &amp;amp;&amp;amp; $data['photo'] instanceof UploadedFile &amp;amp;&amp;amp; $data['photo']-&amp;gt;isValid()) {
                $filePath = $this-&amp;gt;storeFile($data['photo'], 'products', 'product_');
                $data['photo'] = $filePath;
            } else {
                $data['photo'] = null;
            }

            // Create the record in the database
            $created = Product::create($data);

            DB::commit();

            return $created-&amp;gt;load('category', 'taxRate');
        } catch (Exception $e) {
            DB::rollBack();

            // Log the error
            Log::error('Error in storing data: ' , [
                'message' =&amp;gt; $e-&amp;gt;getMessage(),
                'code' =&amp;gt; $e-&amp;gt;getCode(),
                'line' =&amp;gt; $e-&amp;gt;getLine(),
                'trace' =&amp;gt; $e-&amp;gt;getTraceAsString()
            ]);

            return null;
        }
    }
    public function update(Product $product, array $data, $userId)
    {
        DB::beginTransaction();
        try {
            $data['updated_by'] = $userId;

            // Correct way to check file
            if (isset($data['photo']) &amp;amp;&amp;amp; $data['photo'] instanceof UploadedFile &amp;amp;&amp;amp; $data['photo']-&amp;gt;isValid()) {
                $filePath = $this-&amp;gt;updateFile($data['photo'], 'products', 'product_', $product-&amp;gt;photo);
                $data['photo'] = $filePath;
            }

            // Perform the update
            $product-&amp;gt;update($data);

            DB::commit();
            return $product;
        } catch (Exception $e) {
            DB::rollBack();

            // Log the error
            Log::error('Error updating data: ' , [
                'message' =&amp;gt; $e-&amp;gt;getMessage(),
                'code' =&amp;gt; $e-&amp;gt;getCode(),
                'line' =&amp;gt; $e-&amp;gt;getLine(),
                'trace' =&amp;gt; $e-&amp;gt;getTraceAsString()
            ]);

            return null;
        }
    }
    // In FloorRepository.php
    public function delete(Product $product)
    {
        DB::beginTransaction();
        try {
            // 1. Delete associated files
            if (!empty($product-&amp;gt;photo)) {
                $this-&amp;gt;deleteOldFile($product-&amp;gt;photo);
            }
            // 5. Finally, delete the data itself
            $product-&amp;gt;delete();

            DB::commit();
            return true;

        } catch (Exception $e) {
            DB::rollBack();

            Log::error('Error deleting data: ' , [
                'id' =&amp;gt; $product-&amp;gt;id,
                'message' =&amp;gt; $e-&amp;gt;getMessage(),
                'code' =&amp;gt; $e-&amp;gt;getCode(),
                'line' =&amp;gt; $e-&amp;gt;getLine(),
                'trace' =&amp;gt; $e-&amp;gt;getTraceAsString()
            ]);

            return false;
        }
    }
    public function find($id)
    {
        return Product::with('category', 'taxRate')-&amp;gt;find($id);
    }
    private function storeFile($file, $filePath, $prefix)
    {
        // Define the directory path
        // TODO: Change path if needed
        # $filePath = 'files/images/country'; # change path if needed
        $directory = public_path($filePath);

        // Ensure the directory exists
        if (!file_exists($directory)) {
            mkdir($directory, 0777, true);
        }

        // Generate a unique file name
        // TODO: Change path if needed
        # $fileName = uniqid('flag_', true) . '.' . $file-&amp;gt;getClientOriginalExtension();
        $fileName = uniqid($prefix, true) . '.' . $file-&amp;gt;getClientOriginalExtension();

        // Move the file to the destination directory
        $file-&amp;gt;move($directory, $fileName);

        // path &amp;amp; file name in the database
        $path = $filePath . '/' . $fileName;
        return $path;
    }
    private function updateFile($file, $filePath, $prefix, $oldFilePath = null)
    {
        // Delete the old file if it exists
        $this-&amp;gt;deleteOldFile($oldFilePath);

        // Store path &amp;amp; file name in the database
        $path = $this-&amp;gt;storeFile($file, $filePath, $prefix);
        return $path;
    }
    private function deleteOldFile($oldFilePath)
    {
        // TODO: ensure from database
        if (!empty($oldFilePath)) { # ensure from database
            $oldFullFilePath = public_path($oldFilePath); // Use without prepending $filePath
            if (file_exists($oldFullFilePath)) {
                unlink($oldFullFilePath); // Delete the old file
                return true;
            } else {
                Log::warning('Old file not found for deletion', ['path' =&amp;gt; $oldFullFilePath]);
                return false;
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;For Migration &amp;amp; other Commands&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. model &amp;amp; migration:
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;php artisan make:model BranchContactInfo -m&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;php artisan make:model BranchContactInfo -mcr&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;-m&lt;/code&gt; flag creates a new migration file.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;-c&lt;/code&gt; flag creates a controller.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;-r&lt;/code&gt; flag specifies that it should be a &lt;code&gt;resource controller&lt;/code&gt;, which includes all the standard methods for a CRUD (Create, Read, Update, Delete) application.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. controller:
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;php artisan make:controller Api/PostController --api&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;php artisan make:controller ProductController --resource&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Migration:
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;php artisan make:migration create_fields_table&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;php artisan make:migration add_telegram_group_link_to_settings_table&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;php artisan make:migration add_columns_to_users_table --table=users&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Schema::create('rooms', function (Blueprint $table) {
            $table-&amp;gt;id();
            $table-&amp;gt;unsignedBigInteger('user_id')-&amp;gt;nullable();
            $table-&amp;gt;unsignedBigInteger('hotel_id')-&amp;gt;nullable();
            $table-&amp;gt;unsignedBigInteger('floor_id')-&amp;gt;nullable();

            $table-&amp;gt;foreignId('user_id')-&amp;gt;constrained('users')-&amp;gt;onDelete('cascade');
            $table-&amp;gt;foreignId('hotel_id')-&amp;gt;constrained('hotels')-&amp;gt;onDelete('cascade');
            $table-&amp;gt;foreignId('created_by')-&amp;gt;nullable()-&amp;gt;constrained('users')-&amp;gt;onDelete('cascade');
            $table-&amp;gt;foreignId('updated_by')-&amp;gt;nullable()-&amp;gt;constrained('users')-&amp;gt;onDelete('cascade');

            $table-&amp;gt;string('room_no')-&amp;gt;nullable();
            $table-&amp;gt;enum('bed_type', ['Single', 'Double', 'Triple'])-&amp;gt;default('Single')-&amp;gt;nullable();
            $table-&amp;gt;boolean('has_ac')-&amp;gt;default(true)-&amp;gt;nullable();
            $table-&amp;gt;text('description')-&amp;gt;nullable();
            $table-&amp;gt;enum('status', ['Active', 'Inactive'])-&amp;gt;default('Active')-&amp;gt;nullable();
$table-&amp;gt;index(['id', 'lat', 'long'], 'idx_lat_long');
$table-&amp;gt;string('status', 50)-&amp;gt;nullable()-&amp;gt;after('check_out')-&amp;gt;default('confirmed');
            $table-&amp;gt;decimal('rent',10, 2)-&amp;gt;nullable()-&amp;gt;default(0)-&amp;gt;after('check_out');
            $table-&amp;gt;timestamps();
        });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;&lt;em&gt;ii. add_columns&lt;/em&gt;&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function up()
{
Schema::table('settings', function (Blueprint $table) {
$table-&amp;gt;string('telegram_group_link')-&amp;gt;nullable()-&amp;gt;after('task_timing');

$table-&amp;gt;foreignId('building_id')-&amp;gt;nullable()-&amp;gt;after('user_id')-&amp;gt;constrained('buildings')-&amp;gt;onDelete('cascade');

$table-&amp;gt;foreignId('popular_place_id')-&amp;gt;nullable()-&amp;gt;constrained('popular_places')-&amp;gt;onDelete('cascade')-&amp;gt;after('package_id');

$table-&amp;gt;dropForeign(['hotel_id']);
$table-&amp;gt;dropColumn('hotel_id');

$table-&amp;gt;dropForeign(['floor_id']);
$table-&amp;gt;dropColumn('floor_id');

$table-&amp;gt;dropForeign(['room_id']);
$table-&amp;gt;dropColumn('room_id');

$table-&amp;gt;enum('status', ['pending', 'confirmed', 'checked_in', 'checked_out', 'cancelled'])
                  -&amp;gt;default('pending')
                  -&amp;gt;nullable()
                  -&amp;gt;change();

$table-&amp;gt;renameColumn('price', 'rent');
    });
}

public function down()
{
    Schema::table('settings', function (Blueprint $table) {
        $table-&amp;gt;dropColumn('telegram_group_link');
    });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. seeder:
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;php artisan make:seeder UserSeeder&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;php artisan db:seed&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Request Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function rules()
    {
        $data = $this-&amp;gt;route('invitation_code');
        $id = $data?-&amp;gt;id ?? null;

        return InvitationCode::rules($id);
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;2nd part&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function rules()
    {
        // Get the route name and apply null-safe operator
        $routeName = $this-&amp;gt;route()?-&amp;gt;getName();

        if ($routeName === 'events.update') {
            return Event::updateRules();
        }

        return Event::rules();
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Postman token save&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let responseData = pm.response.json();

if (responseData.success &amp;amp;&amp;amp; responseData.data.token) {
    // pm.globals.set("token", responseData.data.token); // set global token
    pm.collectionVariables.set("token", responseData.data.token);
    console.log("Token set in collection variable successfully.");
} else {
    console.error("Failed to set token. Check response structure or API call.");
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;6. Highly suitable and necessary commands when deploying a Laravel project to a live server like CPanel&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;1st run clear-cache on your site&lt;/code&gt;&lt;br&gt;
&lt;code&gt;php artisan config:clear &amp;amp;&amp;amp; php artisan route:clear &amp;amp;&amp;amp; php artisan view:clear &amp;amp;&amp;amp; php artisan optimize&lt;/code&gt;&lt;br&gt;
&lt;code&gt;php artisan storage:link&lt;/code&gt;&lt;/p&gt;



&lt;p&gt;&lt;code&gt;composer install --no-dev -o&lt;/code&gt;&lt;br&gt;
&lt;code&gt;php artisan config:clear&lt;/code&gt;&lt;br&gt;
&lt;code&gt;php artisan route:clear&lt;/code&gt;&lt;br&gt;
&lt;code&gt;php artisan view:clear&lt;/code&gt;&lt;br&gt;
&lt;code&gt;php artisan cache:clear&lt;/code&gt;&lt;br&gt;
&lt;code&gt;php artisan config:cache&lt;/code&gt;&lt;br&gt;
&lt;code&gt;php artisan route:cache&lt;/code&gt;&lt;br&gt;
&lt;code&gt;php artisan storage:link&lt;/code&gt;&lt;br&gt;
&lt;code&gt;composer install --optimize-autoloader --no-dev&lt;/code&gt;&lt;br&gt;
&lt;code&gt;php artisan optimize&lt;/code&gt;&lt;br&gt;
&lt;code&gt;php artisan optimize:clear&lt;/code&gt;&lt;br&gt;
&lt;code&gt;php artisan config:cache &amp;amp;&amp;amp; php artisan route:cache&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;🚨 &lt;strong&gt;Why Sanctum Token API Not Working on cPanel?&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;1. Your API URL is wrong (APP_URL mismatch)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;লোকালে তুমি হয়তো এভাবে করেছো:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;APP_URL=http://127.0.0.1:8000
SANCTUM_STATEFUL_DOMAINS=127.0.0.1
SESSION_DOMAIN=127.0.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;cPanel-এ গেলে এগুলো ভুল হয়ে যায়।&lt;/p&gt;




&lt;p&gt;❌ &lt;strong&gt;Wrong configuration (common mistake on cPanel)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;APP_URL=http://localhost
SANCTUM_STATEFUL_DOMAINS=localhost
SESSION_DOMAIN=localhost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;এগুলো shared hosting server এ কাজ করে না।&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;✅** Correct cPanel settings**&lt;/p&gt;

&lt;p&gt;তোমার লাইভ ডোমেইন যদি হয়:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;তাহলে &lt;code&gt;.env&lt;/code&gt; এ দিতে হবে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;APP_URL=https://example.com
SESSION_DOMAIN=.example.com
SANCTUM_STATEFUL_DOMAINS=example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;যদি তুমি subdomain ব্যবহার করো:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;api.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;তাহলে:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;APP_URL=https://api.example.com
SESSION_DOMAIN=.example.com
SANCTUM_STATEFUL_DOMAINS=example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;আপনি যদি লোকাল মেশিনে (localhost) রান করা অ্যাপ &lt;strong&gt;টানেল করে পাবলিক URL&lt;/strong&gt; বানাতে চান, যাতে যেকেউ ইন্টারনেট থেকে দেখতে পারে — সবচেয়ে সহজ সমাধান হলো ngrok, Cloudflare Tunnel, বা localtunnel ব্যবহার করা। নিচে সহজভাবে দেখাচ্ছি 👇&lt;/p&gt;




&lt;p&gt;🚀 &lt;strong&gt;অপশন 1&lt;/strong&gt;: &lt;em&gt;&lt;strong&gt;ngrok (সবচেয়ে জনপ্রিয়)&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
✅ ধাপ:&lt;/p&gt;

&lt;p&gt;1️⃣ ডাউনলোড করুন: &lt;code&gt;https://ngrok.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;2️⃣ সাইন আপ করে auth token নিন&lt;br&gt;
3️⃣ টার্মিনালে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ngrok config add-authtoken YOUR_TOKEN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4️⃣ ধরুন আপনার লোকাল সার্ভার চলছে &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ngrok http 3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 আউটপুটে পাবেন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Forwarding  https://abcd-1234.ngrok-free.app -&amp;gt; http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এই URL যেকেউ খুলতে পারবে 🌍&lt;/p&gt;




&lt;p&gt;☁️ &lt;strong&gt;অপশন 2&lt;/strong&gt;: &lt;strong&gt;Cloudflare Tunnel (cloudflared) — ফ্রি ও স্টেবল&lt;/strong&gt;&lt;br&gt;
✅ ধাপ:&lt;/p&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;ডাউনলোড&lt;/strong&gt;: &lt;code&gt;https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;2️⃣ রান করুন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cloudflared tunnel --url http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 পাবেন এমন URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://random-name.trycloudflare.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🔧 &lt;strong&gt;অপশন 3&lt;/strong&gt;: localtunnel (npm)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g localtunnel
lt --port 3000

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://abc.loca.lt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fagw8li3qybtbl1jviwvw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fagw8li3qybtbl1jviwvw.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🧪 &lt;strong&gt;Example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;আপনার Node.js app যদি:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run dev
# running on http://localhost:4000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;তাহলে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ngrok http 4000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;তারপর পাওয়া URL শেয়ার করুন ✅&lt;/p&gt;

</description>
    </item>
    <item>
      <title>𝐏𝐫𝐨𝐒𝐨𝐟𝐭 𝐄𝐱𝐩𝐞𝐫𝐢𝐞𝐧𝐜𝐞: 𝟑-𝟓 𝐘𝐞𝐚𝐫. Laravel IQ - Part-02</title>
      <dc:creator>Ruhul Amin Sujon</dc:creator>
      <pubDate>Mon, 26 May 2025 19:00:16 +0000</pubDate>
      <link>https://dev.to/ruhul_aminsujon_f65b3678/-laravel-iq-part-02-2hph</link>
      <guid>https://dev.to/ruhul_aminsujon_f65b3678/-laravel-iq-part-02-2hph</guid>
      <description>&lt;p&gt;🧠 &lt;strong&gt;Laravel Developer, কিন্তু এগুলো জানেন না? শিখে নিন ৮টি Core বিষয় !&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;আপনি কি নিচের Laravel বিষয়গুলো জানেন না?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Route Model Binding&lt;/li&gt;
&lt;li&gt;Polymorphic Relationship&lt;/li&gt;
&lt;li&gt;Middleware Priority&lt;/li&gt;
&lt;li&gt;Eager Loading vs Lazy Loading&lt;/li&gt;
&lt;li&gt;n+1 Query Problem&lt;/li&gt;
&lt;li&gt;with() vs load() method-এর পার্থক্য&lt;/li&gt;
&lt;li&gt;Pagination&lt;/li&gt;
&lt;li&gt;Job &amp;amp; Queue System&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ যদি Laravel এ কাজ করেন, তাহলে এগুলো জানা আপনার জন্য বাধ্যতামূলক। না জানলে বড় প্রজেক্টে আপনি বারবার performance, maintainability আর bug নিয়ে ঝামেলায় পড়বেন।&lt;/p&gt;

&lt;p&gt;চলুন একে একে সবগুলো সহজ ভাষায় ও উদাহরণসহ বুঝে নেই।&lt;/p&gt;




&lt;p&gt;🔹 &lt;strong&gt;&lt;em&gt;প্রশ্ন ১&lt;/em&gt;. Route Model Binding – ID দিয়ে আর ঝামেলা না!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔍 &lt;code&gt;URL এর মধ্যে ID দিলে Laravel নিজে থেকেই Model খুঁজে এনে দিবে&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Route::get('/users/{user}', function (User $user) {
    return $user-&amp;gt;name;
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Laravel নিজে User::findOrFail($id) চালিয়ে $user নামের ভ্যারিয়েবল তৈরি করে দিবে। {user} একটি id দিলে Laravel নিজেই User মডেল থেকে সেই id-এর row খুঁজে $user-এ inject করবে।&lt;/p&gt;

&lt;p&gt;🛠️ &lt;strong&gt;সুবিধা&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;কোড ছোট হয়&lt;/li&gt;
&lt;li&gt;Route parameter-এর মাধ্যমে সরাসরি Eloquent model instance&lt;/li&gt;
&lt;li&gt;অটো 404 পাওয়া যায়&lt;/li&gt;
&lt;li&gt;IDE অটো suggest করে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;➤ &lt;strong&gt;Custom Binding করা যায়?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;হ্যাঁ, যদি আপনি ID ছাড়া অন্য কোনো field দিয়ে binding করতে চান যেমন username, তাহলে RouteServiceProvider এ আপনি define করতে পারেন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function boot()
{
    Route::bind('user', function ($value) {
        return \App\Models\User::where('username', $value)-&amp;gt;firstOrFail();
    });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 &lt;strong&gt;&lt;em&gt;প্রশ্ন ২&lt;/em&gt;. Polymorphic Relationship: এক কমেন্ট দিয়ে সব কভার!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔄 &lt;code&gt;একই Comment model দিয়ে Post, Video, Image – সবকিছুতে কমেন্ট করা যাবে&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;➤ &lt;strong&gt;কী এটা?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Polymorphic Relationship হল এমন একটি রিলেশনশিপ যেখানে একটি model একাধিক model-এর সাথে একই রিলেশনশিপ ফর্ম ব্যবহার করে সংযুক্ত হতে পারে।&lt;/p&gt;

&lt;p&gt;🔸 &lt;strong&gt;সমস্যা&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;আপনি এমন একটি ওয়েব অ্যাপ বানাচ্ছেন যেখানে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ব্যবহারকারীরা পোস্টে কমেন্ট করতে পারবে&lt;/li&gt;
&lt;li&gt;আবার ভিডিওতেও কমেন্ট করতে পারবে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;এখন আপনি কি আলাদা post_comments, video_comments টেবিল করবেন?&lt;/p&gt;

&lt;p&gt;না, Laravel বলে—একটাই comments টেবিল বানান, আমরা বুঝে নেব কোনটা কার কমেন্ট।&lt;/p&gt;

&lt;p&gt;🔸 &lt;strong&gt;Laravel Polymorphic Relationship দিয়ে এমন হবে:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🧾 &lt;strong&gt;Database Structure:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;comments&lt;/strong&gt; টেবিলে থাকবে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;id&lt;/li&gt;
&lt;li&gt;body&lt;/li&gt;
&lt;li&gt;commentable_id ➜ কোন জিনিসের ID&lt;/li&gt;
&lt;li&gt;commentable_type ➜ কোন model (Post, Video)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔸 &lt;strong&gt;Model Setup:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Comment Model:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Comment extends Model
{
    public function commentable()
    {
        return $this-&amp;gt;morphTo();
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Post Model:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Post extends Model
{
    public function comments()
    {
        return $this-&amp;gt;morphMany(Comment::class, 'commentable');
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Video Model&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Video extends Model
{
    public function comments()
    {
        return $this-&amp;gt;morphMany(Comment::class, 'commentable');
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔸 &lt;strong&gt;কিভাবে ব্যবহার করবেন?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;১. Post-এ কমেন্ট:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$post = Post::find(1);
$post-&amp;gt;comments()-&amp;gt;create([
    'body' =&amp;gt; 'এই পোস্টটা দারুন ছিলো!',
]);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;২. Video-তে কমেন্ট:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$video = Video::find(1);
$video-&amp;gt;comments()-&amp;gt;create([
    'body' =&amp;gt; 'ভিডিওটা অসাধারণ!',
]);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;৩. কোন Comment কার সেটা বের করা:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$comment = Comment::find(1);
$owner = $comment-&amp;gt;commentable; // Post or Video
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 &lt;strong&gt;&lt;em&gt;প্রশ্ন ৩&lt;/em&gt;. Middleware Priority – কার আগে কে চলবে?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Laravel-এ সব middleware একসাথে চললে কোনোটা আগে চলবে আর কোনটা পরে?&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;আপনি একটা middleware বানিয়েছেন যা language set করে, আরেকটা middleware আছে যা auth চেক করে।&lt;/p&gt;

&lt;p&gt;Laravel এ middleware চালানোর অর্ডার যদি ঠিক না থাকে, তাহলে authenticated user এর ভাষা ঠিকভাবে সেট না-ও হতে পারে।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Priority ঠিক করার জায়গা:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;app/Http/Kernel.php ফাইলে নিচে protected $middlewarePriority অংশে সেট করতে হবে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;protected $middlewarePriority = [
    \App\Http\Middleware\SetLocale::class,
    \App\Http\Middleware\Authenticate::class,
];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 &lt;strong&gt;৪. Eager Loading vs Lazy Loading&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;📌 &lt;strong&gt;ধরুন আপনার Post আছে, আর তার সাথে Comments আছে।&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lazy Loading (Bad for performance if many):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$posts = Post::all();
foreach ($posts as $post) {
    echo $post-&amp;gt;comments-&amp;gt;count(); // এখানে প্রতি লুপে একবার query চালায়
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Eager Loading (Good Practice):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$posts = Post::with('comments')-&amp;gt;get();
foreach ($posts as $post) {
    echo $post-&amp;gt;comments-&amp;gt;count(); // শুধু ২টা query চালাবে
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;পার্থক্য&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lazy Loading = প্রয়োজন অনুযায়ী লোড হয় (তবে বেশি Query চালায়)&lt;/li&gt;
&lt;li&gt;Eager Loading = আগেই সব রিলেশন নিয়ে আসে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ধরুন আপনি একটি admin panel বানাচ্ছেন, যেখানে ৫০টি order লিস্টে দেখাতে হবে এবং সাথে প্রতিটির customer এবং তার profile লোড করতে হবে।&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;আপনি যদি Lazy Loading করেন, তাহলে ১টা orders + ৫০টা customers + ৫০টা profiles = &lt;strong&gt;১০১টি Query!&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;যদি Eager Loading করেন: Order::with(['customer.profile'])-&amp;gt;get(); → &lt;strong&gt;৩টি Query!&lt;/strong&gt; ✔️&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;এটাই পার্থক্য — বুঝে না করলে performance মার খায়।&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;&lt;em&gt;প্রশ্ন ৫&lt;/em&gt;&lt;/strong&gt;. n+1 Query Problem – অজান্তেই আপনার App ধীরে হয়!&lt;/p&gt;

&lt;p&gt;🤕 &lt;strong&gt;সমস্যা কী?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$users = User::all();
foreach ($users as $user) {
    echo $user-&amp;gt;profile-&amp;gt;phone;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এখানে ধরুন ১০০ জন ইউজার আছে। তাহলে হবে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;১টি query: users টেবিল থেকে&lt;/li&gt;
&lt;li&gt;১০০টি query: প্রতিটি profile এর জন্য&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;= মোট ১০১টি query! ভয়ংকর!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;সমাধান&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$users = User::with('profile')-&amp;gt;get();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এখন ২টি query চলবে: ১টা users, ১টা profiles। Performance ৫০x ভালো!&lt;/p&gt;

&lt;p&gt;🔹&lt;strong&gt;&lt;em&gt;প্রশ্ন ৬&lt;/em&gt;&lt;/strong&gt;. with() vs load() – অনেকেই গুলিয়ে ফেলে&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;with():&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Query এর সময়েই রিলেশন নিয়ে আসে। &lt;strong&gt;Query builder এর সাথে চলে।&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$posts = Post::with('comments')-&amp;gt;get();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;load():&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Model পাওয়ার পর আলাদাভাবে রিলেশন লোড করে। &lt;strong&gt;Model instance এর সাথে চলে।&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$post = Post::find(1);
$post-&amp;gt;load('comments');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🚦 &lt;strong&gt;কখন কোনটা?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;with() – যখন একসাথে query করতে চান&lt;/li&gt;
&lt;li&gt;load() – যখন model আগে থেকেই আছে, পরে রিলেশন দরকার&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹&lt;strong&gt;&lt;em&gt;প্রশ্ন ৭&lt;/em&gt;&lt;/strong&gt;. Pagination না জানলে কী হয়?&lt;/p&gt;

&lt;p&gt;✅ Laravel-এ Pagination ব্যবহার না করলে আপনি হয়তো একবারেই ৫০০টা বা ৫০০০টা ডাটা get() দিয়ে নিয়ে নিচ্ছেন! এতে হয়ে যাচ্ছে বিশাল একটি ভুল – কারণ এত ডাটা একসাথে RAM-এ উঠানো মানে হচ্ছে: সার্ভার স্লো, রেসপন্স টাইম বেশি, এবং অ্যাপ ধীর গতির।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$users = User::all(); // ❌ – সব user একবারে টেনে আনছে
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এই কোড যদি admin panel-এর কোনো টেবিলে ব্যবহার করেন, তাহলে শুরুতেই ১০,০০০ জন ব্যবহারকারীর সব ডাটা টেনে আনছে – যেটা একদমই অপ্টিমাইজড না।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;সমাধান&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$users = User::paginate(20); // ✅ প্রতিবার ২০টি করে ডাটা আসবে
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এখন শুধু প্রথম ২০টি user আসবে, pagination link থাকবে (Next, Previous), UI-ও দ্রুত রেসপন্স করবে।&lt;/p&gt;

&lt;p&gt;Laravel Pagination আপনাকে built-in pagination link ({{ $users-&amp;gt;links() }}) দিয়ে দেয়, যেখানে Bootstrap বা Tailwind UI নিজে থেকেই render হয়।&lt;/p&gt;




&lt;p&gt;⚠️ &lt;strong&gt;Pagination না বুঝলে কী সমস্যা হতে পারে?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;বড় ডাটাসেট লোড করলে memory overflow হয়ে যায়&lt;/li&gt;
&lt;li&gt;User interface হ্যাং করে&lt;/li&gt;
&lt;li&gt;Lazy loading বা infinite scroll করা যায় না&lt;/li&gt;
&lt;li&gt;Mobile user-দের জন্য page load time বেড়ে যায়&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;প্রফেশনাল Laravel ডেভেলপার হলে Pagination মাস্ট!&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;সব লিস্টে paginate() বা simplePaginate() ব্যবহার করুন&lt;/li&gt;
&lt;li&gt;API বানালে meta, links সহ JSON ফর্ম্যাটে paginate করুন&lt;/li&gt;
&lt;li&gt;Blade টেমপ্লেটে {{ $items-&amp;gt;links() }} ব্যবহার করতে ভুলবেন না&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹&lt;strong&gt;&lt;em&gt;প্রশ্ন ৮&lt;/em&gt;&lt;/strong&gt;. Job &amp;amp; Queue System না জানলে কী হয়?&lt;/p&gt;

&lt;p&gt;✅ Laravel-এ যদি আপনি সব কাজ রিয়েল-টাইমে controller-এর ভেতর করে ফেলেন — যেমন, ইমেইল পাঠানো, ফাইল প্রসেসিং, API থেকে বড় রেসপন্স আনানো — তাহলে ইউজারকে অপেক্ষা করতে হয়। এতে অ্যাপ ধীর হয়ে যায়, ইউজার বিরক্ত হয়।&lt;/p&gt;

&lt;p&gt;Laravel আপনাকে &lt;strong&gt;Job &amp;amp; Queue&lt;/strong&gt;-এর মাধ্যমে ব্যাকগ্রাউন্ডে সেই কাজগুলো চালানোর সুযোগ দেয়।&lt;/p&gt;

&lt;p&gt;🔧 &lt;strong&gt;উদাহরণ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ধরুন, কেউ আপনার অ্যাপে রেজিস্ট্রেশন করলো। তখন আপনি চাইছেন তাকে একটি Welcome Email পাঠাতে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong Way: (সব একসাথে):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function register(Request $request)
{
    // User create...
    Mail::to($user-&amp;gt;email)-&amp;gt;send(new WelcomeMail($user)); // ❌ এই লাইনে ইউজারকে অপেক্ষা করতে হয়
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Good Way: (Queue ব্যবহার):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan make:job SendWelcomeEmailJob
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧠 SendWelcomeEmailJob.php&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\Mail\WelcomeMail;
use Illuminate\Support\Facades\Mail;

class SendWelcomeEmailJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $user;

    public function __construct($user)
    {
        $this-&amp;gt;user = $user;
    }

    public function handle(): void
    {
        Mail::to($this-&amp;gt;user-&amp;gt;email)-&amp;gt;send(new WelcomeMail($this-&amp;gt;user));
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Controller-এ Job Dispatch করা&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function register(Request $request)
{
    $user = User::create([
        'name' =&amp;gt; $request-&amp;gt;name,
        'email' =&amp;gt; $request-&amp;gt;email,
        'password' =&amp;gt; bcrypt($request-&amp;gt;password),
    ]);

    // ✅ ইমেইল পাঠানো ব্যাকগ্রাউন্ডে চলে যাবে:
    dispatch(new SendWelcomeEmailJob($user));

    return response()-&amp;gt;json(['message' =&amp;gt; 'Registration successful']);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Queue সেটআপ (ডেভ এলভেল — database)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan queue:table
php artisan migrate

.env ফাইলে নিচের লাইনটি যুক্ত/পরিবর্তন করুন:
QUEUE_CONNECTION=database

তারপর Queue Worker চালান:
php artisan queue:work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;এখন কী হলো?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ইউজার রেজিস্ট্রেশন করলো&lt;/li&gt;
&lt;li&gt;response পেল ১ সেকেন্ডের মধ্যে&lt;/li&gt;
&lt;li&gt;Welcome Email meanwhile ব্যাকগ্রাউন্ডে গিয়েই চলে গেল, সে বুঝলোও না!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Job &amp;amp; Queue System না জানলে যা হতে পারে:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ইউজার Action করলে response পেতে সময় বেশি লাগে&lt;/li&gt;
&lt;li&gt;Server Load বেড়ে যায়&lt;/li&gt;
&lt;li&gt;ইমেইল, SMS বা বড় প্রসেসিং এ কাজ স্লো হয়ে যায়&lt;/li&gt;
&lt;li&gt;Real-time Notification দেওয়া সম্ভব হয় না&lt;/li&gt;
&lt;li&gt;আগে যদি আপনি Mail::send() সরাসরি ব্যবহার করতেন, তাহলে পুরো Email Sending ব্লক করে রাখতো ইউজারকে।&lt;/li&gt;
&lt;li&gt;এখন Job + Queue দিয়ে সব async হয়ে গেছে — সার্ভারেও চাপ কম, ইউজারও খুশি।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🧠 &lt;strong&gt;উপসংহার&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel দিয়ে শুধুমাত্র কাজ চালিয়ে নেওয়া আর প্রোডাকশন লেভেল অ্যাপ তৈরি করার মধ্যে অনেক তফাৎ।&lt;/p&gt;

&lt;p&gt;যে বিষয়গুলো না জানলে আপনি প্রায় নিশ্চিতভাবেই সমস্যায় পড়বেন:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Route Model Binding&lt;/strong&gt; না জানলে প্রতি রাউটে boilerplate কোড লিখতে হয়&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polymorphic Relationship&lt;/strong&gt; না জানলে বারবার structure ডুপ্লিকেট হয়&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Middleware Priority&lt;/strong&gt; না বুঝলে request flow unpredictable হয়ে পড়ে&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Eager vs Lazy Loading&lt;/strong&gt; না জানলে ব্যাকেন্ড ধীরগতির হয়&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;n+1 Problem&lt;/strong&gt; থেকে Performance মার খায়&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;with() vs load()&lt;/strong&gt; এর misuse করে Unnecessary Query চলে&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pagination&lt;/strong&gt; ছাড়া বড় ডাটা লিস্ট করলে অ্যাপ হ্যাং করে&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Job &amp;amp; Queue System&lt;/strong&gt; না জানলে ইউজারকে বেশি সময় অপেক্ষা করাতে হয়&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📢 &lt;strong&gt;শেষ কথা&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel শেখা মানেই শুধু Route, Controller, Model জানা নয়। আপনাকে জানতে হবে &lt;strong&gt;Performance, Scalability এবং Maintainability&lt;/strong&gt;— যাতে ভবিষ্যতের অ্যাপ বড় হলেও আপনি একাই হ্যান্ডেল করতে পারেন।&lt;/p&gt;

</description>
    </item>
    <item>
      <title>𝐏𝐫𝐨𝐒𝐨𝐟𝐭 𝐄𝐱𝐩𝐞𝐫𝐢𝐞𝐧𝐜𝐞: 𝟑-𝟓 𝐘𝐞𝐚𝐫. Laravel IQ - Part-01</title>
      <dc:creator>Ruhul Amin Sujon</dc:creator>
      <pubDate>Mon, 26 May 2025 18:36:42 +0000</pubDate>
      <link>https://dev.to/ruhul_aminsujon_f65b3678/-laravel-iq-part-01-843</link>
      <guid>https://dev.to/ruhul_aminsujon_f65b3678/-laravel-iq-part-01-843</guid>
      <description>&lt;p&gt;&lt;strong&gt;প্রশ্ন 1:&lt;/strong&gt; GET এবং POST এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GET&lt;/strong&gt;: ইউআরএল এর মাধ্যমে ডেটা পাঠায়, সাধারণত ডেটা পড়ার জন্য।&lt;br&gt;
&lt;strong&gt;POST&lt;/strong&gt;: body এর মাধ্যমে ডেটা পাঠায়, সাধারণত নতুন ডেটা তৈরি বা সাবমিট করার জন্য।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন ২&lt;/strong&gt;: আপনি কীভাবে Laravel-এ &lt;code&gt;Route Model Binding&lt;/code&gt; ইমপ্লিমেন্ট করবেন? একটি উদাহরণ দিতে পারেন কি?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel-এ &lt;code&gt;Route Model Binding&lt;/code&gt; এমন একটি ফিচার যা অটোমেটিকভাবে &lt;code&gt;URI-তে দেওয়া ID বা slug অনুযায়ী&lt;/code&gt; সংশ্লিষ্ট মডেলের ইনস্ট্যান্স খুঁজে এনে কন্ট্রোলারে পাস করে দেয়। এতে করে আলাদা করে &lt;code&gt;find() বা where()&lt;/code&gt; মেথড ব্যবহার করতে হয় না।&lt;/p&gt;

&lt;p&gt;Laravel-এ দুই ধরনের Route Model Binding আছে:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Implicit Binding (স্বয়ংক্রিয়)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Explicit Binding (স্পষ্টভাবে)&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;✅ &lt;strong&gt;উদাহরণ: Implicit Route Model Binding&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ধরা যাক, আমাদের একটি &lt;code&gt;Post&lt;/code&gt; মডেল আছে।&lt;/p&gt;

&lt;p&gt;🔸 &lt;strong&gt;Route&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use App\Models\Post;

Route::get('/posts/{post}', [PostController::class, 'show']);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এখানে &lt;code&gt;{post}&lt;/code&gt; হল route parameter এবং Laravel বুঝে নিবে যে এটি &lt;code&gt;App\Models\Post&lt;/code&gt; মডেল এর instance।&lt;/p&gt;

&lt;p&gt;🔸 &lt;strong&gt;Controller&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function show(Post $post)
{
    return view('posts.show', compact('post'));
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এখানে &lt;code&gt;$post&lt;/code&gt; অটোমেটিকভাবে ওই ID অনুযায়ী ডাটাবেজ থেকে খুঁজে আনা হবে। যদি ID মেলে না, তাহলে 404 error দেওয়া হবে।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;উদাহরণ: Explicit Route Model Binding&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;এটি তখন ব্যবহার করা হয় যখন আপনি default key (ID) ছাড়া অন্য কিছু দিয়ে খুঁজতে চান, যেমন &lt;code&gt;slug&lt;/code&gt;।&lt;/p&gt;

&lt;p&gt;🔸 &lt;strong&gt;RouteServiceProvider&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use App\Models\Post;
use Illuminate\Support\Facades\Route;

public function boot()
{
    Route::bind('post', function ($value) {
        return Post::where('slug', $value)-&amp;gt;firstOrFail();
    });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔸 &lt;strong&gt;Route&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Route::get('/posts/{post}', [PostController::class, 'show']);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔸 &lt;strong&gt;Controller&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function show(Post $post)
{
    return view('posts.show', compact('post'));
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এখানে route এর &lt;code&gt;{post}&lt;/code&gt; অংশটা দিয়ে &lt;code&gt;slug&lt;/code&gt; অনুসারে post পাওয়া যাবে।&lt;/p&gt;

&lt;p&gt;🔚 &lt;strong&gt;উপসংহার&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Route Model Binding Laravel-এ কোডকে পরিষ্কার ও ছোট রাখে এবং বেটার পারফর্মেন্স নিশ্চিত করে। Implicit binding সহজ এবং দ্রুত, আর explicit binding কাস্টম ফিল্ডের জন্য ব্যবহার হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন ৩:&lt;/strong&gt; Laravel-এর Eloquent ORM-এ Eager Loading কী? এটি Lazy Loading থেকে কীভাবে আলাদা? N+1 সমস্যা কী, এটি কেন হয় এবং কিভাবে এটি সমাধান করবেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Eager Loading কী?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Eager Loading হল Eloquent ORM-এর একটি টেকনিক যা সম্পর্কিত মডেলের ডেটা আগেই (একসাথে) লোড করে আনে, যাতে অতিরিক্ত query না চলে।&lt;/p&gt;

&lt;p&gt;🔸 সাধারণভাবে, আমরা &lt;code&gt;with()&lt;/code&gt; মেথড ব্যবহার করে eager loading করি।&lt;/p&gt;

&lt;p&gt;🟢 &lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$users = User::with('posts')-&amp;gt;get();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এই ক্ষেত্রে, প্রতিটি &lt;code&gt;User&lt;/code&gt; এর সাথে সম্পর্কিত &lt;code&gt;Post&lt;/code&gt; গুলোও একসাথে একটি আলাদা query দিয়ে আগেই লোড হয়ে যাবে। এতে performance ভালো হয়।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Lazy Loading কী?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lazy Loading&lt;/strong&gt; মানে হল, যখন মূল মডেল লোড হয় তখন শুধুমাত্র মূল ডেটা লোড হয়। কিন্তু যখন সম্পর্কিত ডেটা এক্সেস করা হয়, তখন আলাদা করে query চলে।&lt;/p&gt;

&lt;p&gt;🔴 &lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$users = User::all();

foreach ($users as $user) {
    echo $user-&amp;gt;posts; // প্রতিবার এখানে আলাদা query চলবে
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এই ক্ষেত্রে, প্রথমে সব &lt;code&gt;User&lt;/code&gt; লোড হচ্ছে, তারপর প্রতিটি &lt;code&gt;User&lt;/code&gt; এর জন্য posts লোড করতে আলাদা আলাদা query চলবে। এটাকেই বলে &lt;strong&gt;N+1 problem&lt;/strong&gt;।&lt;/p&gt;

&lt;p&gt;❗ &lt;strong&gt;N+1 Problem কী?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;N+1 Problem&lt;/strong&gt; তখন হয়, যখন আপনি একটি মূল মডেল (যেমন &lt;code&gt;User&lt;/code&gt;) লোড করেন এবং প্রতিটি instance এর জন্য সম্পর্কিত মডেল (যেমন &lt;code&gt;Post&lt;/code&gt;) আলাদা করে লোড হয়।&lt;/p&gt;

&lt;p&gt;🔸 &lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$users = User::all(); // 1 query
foreach ($users as $user) {
    $user-&amp;gt;posts;     // প্রতিটি user এর জন্য 1 করে query = N query
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;মোট query = 1 (User) + N (Posts) = N+1&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;এই সমস্যা performance কমিয়ে দেয়।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;সমাধান: Eager Loading ব্যবহার করুন&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$users = User::with('posts')-&amp;gt;get(); // 2টি query-তেই কাজ শেষ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;১টি query দিয়ে সব &lt;code&gt;User&lt;/code&gt; আনা হয়।&lt;/li&gt;
&lt;li&gt;২য় query দিয়ে সব &lt;code&gt;posts&lt;/code&gt; আনা হয় যেগুলো ঐ সব user-এর।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🧠 &lt;strong&gt;Tips&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;multiple relation eager load করতে পারেন:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Post::with(['user', 'comments'])-&amp;gt;get();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;nested relation eager load করতে পারেন:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User::with('posts.comments')-&amp;gt;get();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔚 &lt;strong&gt;সংক্ষেপে পার্থক্য:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fip0op9mjqipepfi1jy91.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fip0op9mjqipepfi1jy91.png" alt=" " width="800" height="164"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন 4&lt;/strong&gt;: Laravel-এ Accessor এবং Mutator কী এবং এগুলো কীভাবে ব্যবহার করা হয়?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Accessor&lt;/strong&gt;: মডেল থেকে &lt;code&gt;ডেটা পড়ার আগে&lt;/code&gt; ডেটা প্রসেস করে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mutator&lt;/strong&gt;: মডেলে &lt;code&gt;ডেটা সেভ করার আগে&lt;/code&gt; প্রসেস করে।
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Accessor
public function getFullNameAttribute()
{
    return $this-&amp;gt;first_name . ' ' . $this-&amp;gt;last_name;
}

// Mutator
public function setPasswordAttribute($value)
{
    $this-&amp;gt;attributes['password'] = bcrypt($value);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন 5&lt;/strong&gt;: Laravel-এ Authentication এবং Authorization দুটি ভিন্ন কিন্তু সম্পর্কিত সিকিউরিটি কনসেপ্ট। নিচে বাংলা ভাষায় বিস্তারিত ব্যাখ্যা দেওয়া হলো:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Authentication (প্রমাণীকরণ)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authentication&lt;/strong&gt; মানে হচ্ছে ব্যবহারকারীর পরিচয় যাচাই করা — সে কে?&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;Laravel-এ Authentication কীভাবে কাজ করে:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ইউজার লগইন করে (ইমেইল/পাসওয়ার্ড দিয়ে)&lt;/li&gt;
&lt;li&gt;Laravel &lt;code&gt;Auth&lt;/code&gt; ফ্যাসেড ব্যবহার করে ব্যবহারকারীর পরিচয় নিশ্চিত করে&lt;/li&gt;
&lt;li&gt;সফল হলে &lt;code&gt;session&lt;/code&gt; বা &lt;code&gt;token&lt;/code&gt; এর মাধ্যমে ইউজারকে লগইন অবস্থায় রাখে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔧 &lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (Auth::check()) {
    // ইউজার লগইন অবস্থায় আছে
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔐 &lt;strong&gt;Laravel Authentication Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Login, Register, Logout&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Password reset&lt;/li&gt;
&lt;li&gt;API Token authentication (Sanctum/Passport)&lt;/li&gt;
&lt;li&gt;Laravel Breeze, Jetstream, Fortify (Authentication scaffolding)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Authorization (অনুমোদন)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Authorization&lt;/code&gt; মানে হচ্ছে ব্যবহারকারী কি &lt;strong&gt;নির্দিষ্ট কাজ&lt;/strong&gt; করার অনুমতি পাবে?&lt;/p&gt;

&lt;p&gt;👉 পরিচয় নিশ্চিত হওয়ার পরে, Laravel দেখে ইউজার কোনো নির্দিষ্ট রিসোর্স অ্যাক্সেস করতে পারবে কি না।&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;Laravel-এ Authorization কীভাবে হয়:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gate এবং Policy ব্যবহার করে&lt;/li&gt;
&lt;li&gt;নির্দিষ্ট রোল বা পারমিশন যাচাই করা হয়&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔧 &lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (Auth::user()-&amp;gt;can('update', $post)) {
    // ইউজার এই পোস্ট আপডেট করতে পারবে
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔁 &lt;strong&gt;Authentication vs Authorization তুলনা:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdhbpbdg303otrugn2my3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdhbpbdg303otrugn2my3.png" alt=" " width="800" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Laravel Example Scenario&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Authentication Middleware
Route::middleware('auth')-&amp;gt;group(function () {

    // Authorization check
    Route::get('/post/{post}/edit', function (Post $post) {
        if (Gate::allows('edit-post', $post)) {
            // Edit form
        } else {
            abort(403);
        }
    });

});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔚 &lt;strong&gt;উপসংহার&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication বলে ইউজার "কে"&lt;/li&gt;
&lt;li&gt;Authorization বলে ইউজার "কি করতে পারে"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Laravel-এ এই দুইটি পরিষ্কারভাবে আলাদা করা হয়েছে, এবং তাদের জন্য আলাদা মেকানিজম ব্যবহার হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন ৬&lt;/strong&gt;: Laravel-এ আপনি কীভাবে একটি Custom Authentication Driver ইমপ্লিমেন্ট করবেন?&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel সাধারণত &lt;code&gt;session এবং token&lt;/code&gt; (API) ভিত্তিক authentication সাপোর্ট করে, তবে আপনি চাইলে নিজের মতো করে একটি &lt;code&gt;Custom Authentication Driver&lt;/code&gt; তৈরি করতে পারেন।&lt;/p&gt;

&lt;p&gt;Laravel-এ custom authentication driver তৈরি করতে হলে নিচের ধাপগুলো অনুসরণ করতে হয়:&lt;/p&gt;

&lt;p&gt;🛠️ &lt;strong&gt;ধাপ ১: Custom Guard Class তৈরি করুন&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ধরুন আপনি একটি &lt;code&gt;CustomAuthGuard&lt;/code&gt; নামের class বানাবেন।&lt;/p&gt;

&lt;p&gt;🔸 &lt;code&gt;app/Auth/CustomAuthGuard.php&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace App\Auth;

use Illuminate\Contracts\Auth\Guard;
use Illuminate\Contracts\Auth\UserProvider;
use Illuminate\Http\Request;
use Illuminate\Contracts\Auth\Authenticatable;

class CustomAuthGuard implements Guard
{
    protected $request;
    protected $provider;
    protected $user;

    public function __construct(UserProvider $provider, Request $request)
    {
        $this-&amp;gt;provider = $provider;
        $this-&amp;gt;request = $request;
    }

    public function check()
    {
        return !is_null($this-&amp;gt;user());
    }

    public function user()
    {
        if (!is_null($this-&amp;gt;user)) {
            return $this-&amp;gt;user;
        }

        $id = $this-&amp;gt;request-&amp;gt;session()-&amp;gt;get('custom_user_id');

        if ($id) {
            $this-&amp;gt;user = $this-&amp;gt;provider-&amp;gt;retrieveById($id);
        }

        return $this-&amp;gt;user;
    }

    public function id()
    {
        return $this-&amp;gt;user()?-&amp;gt;getAuthIdentifier();
    }

    public function validate(array $credentials = [])
    {
        $user = $this-&amp;gt;provider-&amp;gt;retrieveByCredentials($credentials);

        if ($user &amp;amp;&amp;amp; $this-&amp;gt;provider-&amp;gt;validateCredentials($user, $credentials)) {
            $this-&amp;gt;user = $user;
            return true;
        }

        return false;
    }

    public function setUser(Authenticatable $user)
    {
        $this-&amp;gt;user = $user;
        return $this;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🛠️ &lt;strong&gt;ধাপ ২: Service Provider এর মাধ্যমে Register করুন&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔸 &lt;code&gt;App\Providers\AuthServiceProvider.php&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use App\Auth\CustomAuthGuard;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\ServiceProvider;

public function boot()
{
    Auth::extend('custom_guard', function ($app, $name, array $config) {
        $provider = Auth::createUserProvider($config['provider']);

        return new CustomAuthGuard($provider, $app['request']);
    });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🛠️ &lt;strong&gt;ধাপ ৩: config/auth.php ফাইলে Guard যুক্ত করুন&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'guards' =&amp;gt; [
    'custom' =&amp;gt; [
        'driver' =&amp;gt; 'custom_guard',
        'provider' =&amp;gt; 'users',
    ],
],

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🛠️ &lt;strong&gt;ধাপ ৪: কিভাবে ব্যবহার করবেন&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (Auth::guard('custom')-&amp;gt;attempt(['email' =&amp;gt; 'test@example.com', 'password' =&amp;gt; 'secret'])) {
    // Login successful
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧠 &lt;strong&gt;সংক্ষেপে:&lt;/strong&gt;&lt;br&gt;
ধাপ                কাজ&lt;br&gt;
১ Custom Guard class তৈরি করুন&lt;br&gt;
২ &lt;code&gt;Auth::extend()&lt;/code&gt; এর মাধ্যমে register করুন&lt;br&gt;
৩ &lt;code&gt;config/auth.php&lt;/code&gt;-এ custom guard যুক্ত করুন&lt;br&gt;
৪ &lt;code&gt;Auth::guard('custom')&lt;/code&gt; দিয়ে ব্যবহার করুন&lt;/p&gt;

&lt;p&gt;🔚 &lt;strong&gt;উপসংহার&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Custom authentication তখন দরকার হয় যখন আপনি Session/Token ছাড়াও ভিন্ন কোনো প্রক্রিয়ায় user কে authenticate করতে চান — যেমন API Key, Third-Party Token, LDAP ইত্যাদি।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন ৭:&lt;/strong&gt; Laravel-এ Queues কী এবং কেন ব্যবহার করা হয়? এমন একটি বাস্তব উদাহরণ দিন যেখানে আপনি Queue ব্যবহার করবেন।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Queues কী?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Queue&lt;/strong&gt; (কিউ) হলো Laravel-এর একটি ফিচার যা আপনাকে দীর্ঘ সময় লাগা কাজগুলোকে &lt;strong&gt;পেছনে (background)&lt;/strong&gt; প্রক্রিয়াকরণ করতে সাহায্য করে, যেন ইউজার দ্রুত response পায়।&lt;/p&gt;

&lt;p&gt;এগুলো &lt;code&gt;jobs&lt;/code&gt; আকারে এক বা একাধিক worker দ্বারা প্রসেস হয়।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;কেন Queues ব্যবহার করা হয়?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Queues ব্যবহারের প্রধান কারণগুলো হলো:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;✅ &lt;strong&gt;পারফরম্যান্স বৃদ্ধি&lt;/strong&gt;: যেসব কাজ অনেক সময় নেয়, সেগুলো ব্যাকগ্রাউন্ডে পাঠিয়ে ফেলা যায়।&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;User Experience উন্নয়ন&lt;/strong&gt;: ইউজার request-এর সাথে সাথে response পায়, কাজটি পরে প্রসেস হয়।&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Resources বাঁচানো&lt;/strong&gt;: Worker নির্দিষ্ট resource ব্যবহার করে কাজ সম্পাদন করে।&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;🧠 &lt;strong&gt;Queue ছাড়া vs Queue সহ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔴 &lt;strong&gt;Queue ছাড়া&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function sendEmail()
{
    Mail::to($user)-&amp;gt;send(new WelcomeMail());
    return "Mail Sent!";
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এখানে mail পাঠাতে অনেক সময় লাগতে পারে, যেটা user এর জন্য ধীর অনুভূতি তৈরি করে।&lt;/p&gt;

&lt;p&gt;🟢 &lt;strong&gt;Queue সহ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function sendEmail()
{
    dispatch(new SendWelcomeMailJob($user));
    return "Mail Queued!";
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এখানে কাজটি queue তে পাঠিয়ে দেওয়া হয়, আর ইউজার সাথে সাথে response পায়।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;বাস্তব উদাহরণ: Email Sending&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ধরা যাক, আপনি একজন ইউজারকে রেজিস্ট্রেশনের পর &lt;strong&gt;Welcome Email&lt;/strong&gt; পাঠাতে চান। Email পাঠাতে সময় লাগে — তাই এটি queue-তে পাঠানো উত্তম।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;১. Job তৈরি করুন:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan make:job SendWelcomeEmail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;২. Job কোড:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function handle()
{
    Mail::to($this-&amp;gt;user-&amp;gt;email)-&amp;gt;send(new WelcomeMail($this-&amp;gt;user));
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;৩. Dispatch করুন Controller থেকে:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dispatch(new SendWelcomeEmail($user));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Queue চালু করতে:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;.env&lt;/code&gt; ফাইলে:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;QUEUE_CONNECTION=database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Queue table তৈরি:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan queue:table
php artisan migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Queue worker চালু:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan queue:work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Queue-এ আরও যেসব কাজ পাঠানো যায়:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ইমেইল পাঠানো (Email Sending)&lt;/li&gt;
&lt;li&gt;রিপোর্ট জেনারেট করা (PDF, Excel)&lt;/li&gt;
&lt;li&gt;ভিডিও প্রসেসিং&lt;/li&gt;
&lt;li&gt;নোটিফিকেশন পাঠানো&lt;/li&gt;
&lt;li&gt;বিলম্বিত কাজ (Delayed Jobs)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔚 &lt;strong&gt;সংক্ষেপে&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiej44429k8v74ce3zuj0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiej44429k8v74ce3zuj0.png" alt=" " width="800" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;প্রশ্ন ৮&lt;/strong&gt;: Laravel-এ আপনি কীভাবে Job তৈরি ও Dispatch করবেন?&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔷 &lt;strong&gt;Job কী?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Job হলো একটি ক্লাস যা Laravel Queue-এর মাধ্যমে &lt;strong&gt;delay বা background&lt;/strong&gt;-এ কাজ সম্পন্ন করতে ব্যবহৃত হয়। যেমন: ইমেইল পাঠানো, রিপোর্ট তৈরি, ভিডিও প্রসেস ইত্যাদি।&lt;/p&gt;

&lt;p&gt;🛠️ &lt;strong&gt;Job তৈরি করার ধাপ:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;ধাপ ১: Job ক্লাস তৈরি করুন&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan make:job SendWelcomeEmail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এতে &lt;code&gt;app/Jobs/SendWelcomeEmail.php&lt;/code&gt; ফাইলে একটি ক্লাস তৈরি হবে।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;ধাপ ২: Job-এ কাজ লিখুন&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace App\Jobs;

use App\Mail\WelcomeMail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Mail;

class SendWelcomeEmail implements ShouldQueue
{
    use Queueable;

    protected $user;

    public function __construct($user)
    {
        $this-&amp;gt;user = $user;
    }

    public function handle()
    {
        // মেইল পাঠানোর কাজ
        Mail::to($this-&amp;gt;user-&amp;gt;email)-&amp;gt;send(new WelcomeMail($this-&amp;gt;user));
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;বি.দ্র.: &lt;code&gt;ShouldQueue&lt;/code&gt; ইন্টারফেসটি Laravel কে বলে দেয় যে এটি queue-তে প্রসেস করতে হবে।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;ধাপ ৩: Job Dispatch করুন&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ধরা যাক, ইউজার রেজিস্ট্রেশনের পরে এই Job টি Dispatch করবেন।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use App\Jobs\SendWelcomeEmail;

public function register(Request $request)
{
    $user = User::create([...]);

    // Dispatch Job
    dispatch(new SendWelcomeEmail($user));

    return response()-&amp;gt;json(['message' =&amp;gt; 'User registered and mail queued']);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🛠️ &lt;strong&gt;Queue চালু করার ধাপ (যদি queue ব্যবহার করেন):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;১. &lt;code&gt;.env&lt;/code&gt; ফাইলে সেট করুন:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;QUEUE_CONNECTION=database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;২. Queue table তৈরি করুন:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan queue:table
php artisan migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;৩. Worker চালু করুন:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan queue:work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧠 &lt;strong&gt;আরও কিছু তথ্য:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ আপনি Delay সহ Dispatch করতে পারেন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dispatch(new SendWelcomeEmail($user))-&amp;gt;delay(now()-&amp;gt;addMinutes(5));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ চেইনিং করে একাধিক Job সিরিয়ালি চলাতে পারেন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SendWelcomeEmail::withChain([
    new LogEmailSent($user),
    new NotifyAdmin($user),
])-&amp;gt;dispatch();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔚 সংক্ষেপে:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwhoyb1rx3f6xchkzogzt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwhoyb1rx3f6xchkzogzt.png" alt=" " width="800" height="221"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;প্রশ্ন ৯&lt;/strong&gt;: Laravel-এ যেসব ধরনের Testing আছে, সেগুলো ব্যাখ্যা করুন এবং কখন কোনটি ব্যবহার করবেন তা উল্লেখ করুন।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🧪 Laravel-এ Testing এর ধরনসমূহ:&lt;/p&gt;

&lt;p&gt;Laravel মূলত &lt;code&gt;৩ ধরণের&lt;/code&gt; টেস্টিং সাপোর্ট করে:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;✅ &lt;strong&gt;Feature Testing&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Unit Testing&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Browser Testing (Dusk)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;🔹 &lt;strong&gt;1. Unit Testing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔸 এই টেস্ট ছোট ছোট ফাংশন বা ক্লাসকে isolate করে পরীক্ষা করে।&lt;br&gt;
🔸 সাধারণত Model, Service class বা Helper function ইত্যাদিকে test করতে ব্যবহৃত হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;➤ কখন ব্যবহার করবেন:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;যখন আপনি চান একটি নির্দিষ্ট মেথড সঠিকভাবে কাজ করছে কিনা তা যাচাই করতে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;➤ &lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan make:test MathHelperTest --unit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function test_add_numbers_correctly()
{
    $this-&amp;gt;assertEquals(4, MathHelper::add(2, 2));
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 &lt;strong&gt;2. Feature Testing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔸 এটি পুরোপুরি একটি feature (যেমনঃ route, controller, middleware) পরীক্ষা করে।&lt;br&gt;
🔸 এখানে HTTP request simulate করে সম্পূর্ণ ফ্লো টেস্ট করা হয়।&lt;/p&gt;

&lt;p&gt;➤ &lt;strong&gt;কখন ব্যবহার করবেন:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;যখন আপনি চেক করতে চান, একটি ফিচার ঠিকভাবে কাজ করছে কিনা — যেমন ফর্ম সাবমিশন, লগইন, ইউজার রেজিস্ট্রেশন ইত্যাদি।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;➤ &lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan make:test UserRegistrationTest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function test_user_can_register()
{
    $response = $this-&amp;gt;post('/register', [
        'name' =&amp;gt; 'Ruhul',
        'email' =&amp;gt; 'ruhul@example.com',
        'password' =&amp;gt; 'secret',
        'password_confirmation' =&amp;gt; 'secret',
    ]);

    $response-&amp;gt;assertRedirect('/home');
    $this-&amp;gt;assertDatabaseHas('users', ['email' =&amp;gt; 'ruhul@example.com']);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 &lt;strong&gt;3. Browser Testing (Laravel Dusk)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔸 এটি একটি &lt;strong&gt;End-to-End (E2E)&lt;/strong&gt; টেস্টিং সিস্টেম যা আসল browser ব্যবহার করে UI টেস্ট করে।&lt;br&gt;
🔸 এই টেস্ট ইউজার ইন্টারফেসে ক্লিক, টাইপ, রিডাইরেক্ট ইত্যাদি অনুকরণ করে।&lt;/p&gt;

&lt;p&gt;➤ &lt;strong&gt;কখন ব্যবহার করবেন&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ফর্ম, UI ইন্টারঅ্যাকশন বা জাভাস্ক্রিপ্ট টেস্ট করতে চাইলে।&lt;/li&gt;
&lt;li&gt;লগইন/রেজিস্ট্রেশন প্রক্রিয়ার ভিজ্যুয়াল ফ্লো দেখতে চাইলে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;➤ &lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan dusk:make LoginTest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function test_login()
{
    $this-&amp;gt;browse(function ($browser) {
        $browser-&amp;gt;visit('/login')
                -&amp;gt;type('email', 'test@example.com')
                -&amp;gt;type('password', 'password')
                -&amp;gt;press('Login')
                -&amp;gt;assertPathIs('/home');
    });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧠 &lt;strong&gt;সংক্ষেপে পার্থক্য&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F61omgjif81nwj1lylyil.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F61omgjif81nwj1lylyil.png" alt=" " width="800" height="179"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Laravel-এ Test চালানোর কমান্ড&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;নির্দিষ্ট test file চালাতে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan test --filter=UserRegistrationTest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔚 &lt;strong&gt;উপসংহার&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Laravel-এ testing সিস্টেম অনেক শক্তিশালী এবং development-এর সময় প্রতিটি ধরণের test সঠিকভাবে ব্যবহার করলে bug-free ও বিশ্বাসযোগ্য অ্যাপ তৈরি করা যায়।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;প্রশ্ন ১০&lt;/strong&gt;: Laravel টেস্টে আপনি কীভাবে dependency mock করবেন? একটি উদাহরণ দিন।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;Mocking মানে কী?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mocking মানে হলো এমন কোনো &lt;code&gt;class বা object-এর নকল (fake) ভার্সন তৈরি করা&lt;/code&gt;, যাতে আমরা আসল dependency-এর behavior পরিবর্তন করে test করতে পারি।&lt;/p&gt;

&lt;p&gt;Laravel এ mocking সাধারণত &lt;code&gt;service, external API, repository, notification, mail ইত্যাদি&lt;/code&gt; ক্ষেত্রে করা হয়।&lt;/p&gt;

&lt;p&gt;🔧 &lt;strong&gt;Mocking Dependency কবে দরকার হয়?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;যখন আপনি কোনো &lt;code&gt;external service&lt;/code&gt; (যেমন: payment gateway, SMS API) ব্যবহার করছেন।&lt;/li&gt;
&lt;li&gt;যখন আপনি এমন কোনো ক্লাস বা সার্ভিস টেস্ট করছেন, যেটি অন্য ক্লাসের উপর নির্ভর করে।&lt;/li&gt;
&lt;li&gt;যাতে আপনার টেস্টে "side effects" না হয় (যেমন আসল API call, database change ইত্যাদি)।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;উদাহরণ: একটি Service Class কে Mock করা&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ধরা যাক, আপনি একটি &lt;code&gt;PaymentService&lt;/code&gt; ব্যবহার করছেন যেটা আসল API call করে।&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;Step 1: আসল সার্ভিস ক্লাস (Mock করার জন্য)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace App\Services;

class PaymentService
{
    public function charge($amount)
    {
        // আসল API call (যেটা আমরা টেস্টে করতে চাই না)
        return "Charged {$amount} taka!";
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 &lt;strong&gt;Step 2: Controller যেটি এই সার্ভিস ব্যবহার করে&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace App\Http\Controllers;

use App\Services\PaymentService;

class PaymentController extends Controller
{
    public function pay(PaymentService $payment)
    {
        return $payment-&amp;gt;charge(100);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 &lt;strong&gt;Step 3: এখন টেস্টে এই সার্ভিসকে Mock করব&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace Tests\Feature;

use Tests\TestCase;
use App\Services\PaymentService;
use Illuminate\Support\Facades\App;

class PaymentTest extends TestCase
{
    public function test_payment_service_mock()
    {
        // 1. মক অবজেক্ট তৈরি করুন
        $mock = \Mockery::mock(PaymentService::class);

        // 2. মক মেথডের প্রত্যাশিত রিটার্ন ভ্যালু সেট করুন
        $mock-&amp;gt;shouldReceive('charge')
             -&amp;gt;with(100)
             -&amp;gt;once()
             -&amp;gt;andReturn('Mocked Payment Success!');

        // 3. Laravel container-এ bind করুন
        $this-&amp;gt;app-&amp;gt;instance(PaymentService::class, $mock);

        // 4. এখন Controller call করলে Mock কাজ করবে
        $response = $this-&amp;gt;get('/pay');

        $response-&amp;gt;assertStatus(200);
        $response-&amp;gt;assertSee('Mocked Payment Success!');
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এই টেস্টে আসল &lt;code&gt;charge()&lt;/code&gt; মেথড কল হয় না, বরং আমরা যেভাবে চাই সেভাবে response পাই।&lt;/p&gt;

&lt;p&gt;✅ আরও কিছু জিনিস আপনি Mock করতে পারেন:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F32ctf5mln90bq9up5576.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F32ctf5mln90bq9up5576.png" alt=" " width="800" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Example: HTTP Request Mock (Laravel HTTP client)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use Illuminate\Support\Facades\Http;

public function test_api_call_mock()
{
    Http::fake([
        'api.example.com/*' =&amp;gt; Http::response(['success' =&amp;gt; true], 200),
    ]);

    $response = Http::get('https://api.example.com/data');

    $this-&amp;gt;assertTrue($response-&amp;gt;json()['success']);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔚 &lt;strong&gt;সংক্ষেপে&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8hiyndv253n1fc9v8vlx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8hiyndv253n1fc9v8vlx.png" alt=" " width="800" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;&lt;em&gt;প্রশ্ন ১১&lt;/em&gt;&lt;/strong&gt;: Laravel অ্যাপ্লিকেশনের পারফরম্যান্স (Performance) উন্নত করার জন্য কোন কোন কৌশল ব্যবহার করা যায়? ব্যাখ্যা করুন।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel অনেক ফিচার সমৃদ্ধ একটি ফ্রেমওয়ার্ক, কিন্তু ভুলভাবে কোড করলে এটি ধীরগতির (slow) হতে পারে। নিচে কিছু গুরুত্বপূর্ণ কৌশল দেওয়া হলো যা অ্যাপকে দ্রুততর করতে সাহায্য করবে।&lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;1. Eager Loading ব্যবহার করুন (N+1 সমস্যা এড়াতে)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔸 &lt;strong&gt;সমস্যাঃ&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$users = User::all(); // প্রতিটি ইউজারের সাথে profile দরকার
foreach ($users as $user) {
    echo $user-&amp;gt;profile-&amp;gt;bio;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এই ক্ষেত্রে প্রতিটি user-এর জন্য আলাদা query চলে — এটাকে বলে &lt;strong&gt;N+1 problem&lt;/strong&gt;।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;সমাধানঃ&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$users = User::with('profile')-&amp;gt;get();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🚀 &lt;strong&gt;2. Cache ব্যবহার করুন&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔸 &lt;strong&gt;Page Cache:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cache::put('homepage', $data, 3600); // ১ ঘণ্টা পর্যন্ত cache থাকবে
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔸 &lt;strong&gt;Route Cache:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan route:cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔸 &lt;strong&gt;Config Cache:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan config:cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🚀 &lt;strong&gt;3. Query Optimization করুন&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;বড় query split করে ছোট ছোট করুন।&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;select *&lt;/code&gt; এড়িয়ে প্রয়োজনীয় column গুলো select করুন:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User::select('id', 'name')-&amp;gt;get();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Index তৈরি করুন DB column-এ (search/filter এর ক্ষেত্রে)।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚀 &lt;strong&gt;4. Queue ব্যবহার করুন&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Time-consuming কাজ যেমন ইমেইল, রিপোর্ট জেনারেশন ইত্যাদি Queue-তে পাঠিয়ে দিন।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dispatch(new SendWelcomeEmail($user));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🚀 &lt;strong&gt;5. Pagination ব্যবহার করুন&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;অনেক ডেটা একসাথে লোড না করে paginate করুন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User::paginate(20);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🚀 &lt;strong&gt;6. Lazy Collections ব্যবহার করুন&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel-এর Lazy Collection বড় Dataset-এর জন্য memory-efficient:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User::cursor()-&amp;gt;each(function ($user) {
    // Memory কম ব্যবহার হবে
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🚀 &lt;strong&gt;7. View / Blade Cache (Compiled View)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Blade ফাইলগুলো Compile হয়ে Storage-এ সেভ হয়। Faster rendering-এর জন্য:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan view:cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🚀 &lt;strong&gt;8. Database Connection &amp;amp; Pooling&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.env&lt;/code&gt; ফাইলে যথাযথ DB config দিন।&lt;/li&gt;
&lt;li&gt;যদি high traffic অ্যাপ হয়, database connection pooling ব্যবহার করুন (যেমনঃ Swoole, Octane)।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚀 &lt;strong&gt;9. Laravel Octane ব্যবহার করুন (Advanced)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;High performance অ্যাপ্লিকেশনের জন্য Laravel Octane ব্যবহার করতে পারেন:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Swoole / RoadRunner ব্যবহার করে।&lt;/li&gt;
&lt;li&gt;Laravel request lifecycle পুনরায় load না করে দ্রুততর করে তোলে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚀 &lt;strong&gt;10. Autoload Optimization&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Production mode-এ class autoload অপ্টিমাইজ করুন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;composer install --optimize-autoloader --no-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🚀 &lt;strong&gt;11. Redis বা Memcached Cache Driver ব্যবহার করুন&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ডিফল্ট file cache-এর বদলে Redis ব্যবহার করলে অনেক দ্রুত performance পাওয়া যায়।&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.env&lt;/code&gt; ফাইলে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CACHE_DRIVER=redis
QUEUE_CONNECTION=redis
SESSION_DRIVER=redis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🚀 &lt;strong&gt;12. Assets অপ্টিমাইজ করুন (JS/CSS)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mix বা Vite দিয়ে JS/CSS minify করুন:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run prod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧠 &lt;strong&gt;সংক্ষেপে পারফরম্যান্স টিপস টেবিলে:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fugcbx549zm58ru95hnwy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fugcbx549zm58ru95hnwy.png" alt=" " width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✨ &lt;strong&gt;অতিরিক্ত পরামর্শ:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Debugbar ব্যবহার করে Performance bottleneck খুঁজে বের করুন।&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.env&lt;/code&gt; ফাইলে &lt;code&gt;APP_DEBUG=false&lt;/code&gt; করুন production-এ।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;&lt;em&gt;প্রশ্ন ১২&lt;/em&gt;&lt;/strong&gt;: Laravel-এ আপনি কীভাবে Caching ইমপ্লিমেন্ট করবেন? এবং কোন কোন ধরণের Cache মেকানিজম Laravel-এ পাওয়া যায়?&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;Caching কী?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Caching&lt;/code&gt; হলো একটি অস্থায়ী ডেটা সংরক্ষণের পদ্ধতি যাতে বারবার একি ডেটা পুনরায় ডাটাবেজ বা API থেকে না আনতে হয়। এর ফলে অ্যাপ্লিকেশনের &lt;code&gt;পারফরম্যান্স বৃদ্ধি পায় এবং লোড কমে।&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;🛠️ &lt;strong&gt;Laravel-এ Cache ব্যবহারের সাধারণ নিয়ম&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel-এ Cache ব্যবহারের জন্য &lt;code&gt;Cache&lt;/code&gt; Facade ব্যবহার করা হয়।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;1. Cache সংরক্ষণ করা (Store Cache)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use Illuminate\Support\Facades\Cache;

Cache::put('key', 'value', $seconds = 3600); // ১ ঘণ্টার জন্য সংরক্ষণ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;2. Cache থেকে ডেটা পাওয়া (Retrieve Cache)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$value = Cache::get('key'); // value পাবেন
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;3. ডিফল্ট ভ্যালু সহ Cache পড়া&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$value = Cache::get('key', 'default_value');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;4. Cache থাকলে return, না থাকলে তৈরি করুন&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$value = Cache::remember('users', 3600, function () {
    return DB::table('users')-&amp;gt;get();
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;5. চিরস্থায়ী Cache (forever)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cache::forever('site_name', 'My Website');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;6. Cache মুছে ফেলা (Delete Cache)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cache::forget('key');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;7. সব Cache Clear করা&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan cache:clear
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔄 &lt;strong&gt;Route, Config ও View Cache:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;Route Cache:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan route:cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 &lt;strong&gt;Config Cache:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan config:cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 &lt;strong&gt;View Cache:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan view:cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🚀 &lt;strong&gt;Laravel-এ যে Caching Mechanism/Driver গুলো পাওয়া যায়:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel এর &lt;code&gt;.env&lt;/code&gt; ফাইলে&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CACHE_DRIVER
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;দিয়ে নির্ধারণ করা হয় আপনি কোন সিস্টেম ব্যবহার করছেন।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CACHE_DRIVER=file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;১. file (ডিফল্ট):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Storage ফোল্ডারে ফাইল আকারে cache সংরক্ষণ করে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;২. database:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cache data ডাটাবেজে সংরক্ষণ করে।
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan cache:table
php artisan migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;৩. array:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;শুধুমাত্র current request এর জন্য RAM-এ cache রাখে (testing purpose)।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;৪. redis:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Very fast, scalable memory-based caching system (production recommendation)।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;৫. memcached:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lightweight distributed caching system (alternative to Redis)।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🎯 &lt;strong&gt;ব্যবহার উপযোগিতা অনুযায়ী Driver নির্বাচন:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuy5ajmvl64hvzz39qtce.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuy5ajmvl64hvzz39qtce.png" alt=" " width="800" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🧪 &lt;strong&gt;উদাহরণ: Redis Cache ব্যবহার&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.env&lt;/code&gt; ফাইলে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CACHE_DRIVER=redis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;config/database.php&lt;/code&gt;-এ Redis কানফিগার নিশ্চিত করতে হবে।&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;চাকরির ইন্টারভিউ টিপস:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"Production অ্যাপ্লিকেশনে আপনি কোন cache ব্যবহার করবেন?"&lt;br&gt;
&lt;strong&gt;উত্তর&lt;/strong&gt;: Redis, কারণ এটি in-memory, super fast এবং scalable।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;সংক্ষেপে Laravel Caching:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzlplol5synn41fl5db9m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzlplol5synn41fl5db9m.png" alt=" " width="800" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;&lt;em&gt;প্রশ্ন ১৩&lt;/em&gt;&lt;/strong&gt;: Laravel-এ RESTful API তৈরি করার ধাপগুলো কী কী? প্রসেস ব্যাখ্যা করুন।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;RESTful API কী?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;REST (Representational State Transfer) হলো ওয়েব সার্ভিস ডিজাইনের একটি স্টাইল, যা HTTP মেথড (GET, POST, PUT, DELETE) ব্যবহার করে ডেটা রিসোর্স ম্যানেজ করে।&lt;br&gt;
Laravel-এ RESTful API তৈরি করা খুব সহজ ও শক্তিশালী।&lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;Laravel-এ RESTful API তৈরি করার ধাপগুলো:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;১. রাউট তৈরি করা (Routes)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel-এ API রাউটগুলো &lt;code&gt;routes/api.php&lt;/code&gt; ফাইলে সংজ্ঞায়িত করা হয়।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Route::apiResource('posts', PostController::class);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;apiResource স্বয়ংক্রিয়ভাবে ৭টি RESTful রাউট তৈরি করে (index, show, store, update, destroy)।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;২. কন্ট্রোলার তৈরি (Controller)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan make:controller PostController --api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--api&lt;/code&gt; ফ্ল্যাগ দিয়ে কন্ট্রোলার তৈরি করলে create/edit view মেথড থাকে না, কারণ API শুধু ডেটা হ্যান্ডেল করে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;৩. মডেল ও মাইগ্রেশন তৈরি (Model &amp;amp; Migration)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan make:model Post -m
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;মডেল &lt;code&gt;Post&lt;/code&gt; ও সংশ্লিষ্ট মাইগ্রেশন ফাইল তৈরি হবে।&lt;/li&gt;
&lt;li&gt;মাইগ্রেশন ফাইলে টেবিল কাঠামো ডিফাইন করুন:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Schema::create('posts', function (Blueprint $table) {
    $table-&amp;gt;id();
    $table-&amp;gt;string('title');
    $table-&amp;gt;text('content');
    $table-&amp;gt;timestamps();
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;৪. কন্ট্রোলারে ফাংশন ইমপ্লিমেন্ট করা&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use App\Models\Post;
use Illuminate\Http\Request;

class PostController extends Controller
{
    public function index()
    {
        return Post::all();  // সব পোস্ট দেখাবে
    }

    public function store(Request $request)
    {
        $validated = $request-&amp;gt;validate([
            'title' =&amp;gt; 'required|string',
            'content' =&amp;gt; 'required|string',
        ]);
        $post = Post::create($validated);

        return response()-&amp;gt;json($post, 201);
    }

    public function show($id)
    {
        return Post::findOrFail($id);
    }

    public function update(Request $request, $id)
    {
        $post = Post::findOrFail($id);

        $validated = $request-&amp;gt;validate([
            'title' =&amp;gt; 'sometimes|required|string',
            'content' =&amp;gt; 'sometimes|required|string',
        ]);

        $post-&amp;gt;update($validated);

        return response()-&amp;gt;json($post);
    }

    public function destroy($id)
    {
        Post::destroy($id);

        return response()-&amp;gt;json(null, 204);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;৫. API Resource বা Resource Collections (Optional)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;উন্নত JSON response এর জন্য Laravel Resource ব্যবহার করতে পারেন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan make:resource PostResource
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use App\Http\Resources\PostResource;

public function show($id)
{
    $post = Post::findOrFail($id);
    return new PostResource($post);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;৬. API Authentication (Optional)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API টোকেন বা Passport/ Sanctum দিয়ে নিরাপত্তা নিশ্চিত করতে পারেন।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;৭. Test API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Postman, Insomnia বা অন্য কোনো API client দিয়ে আপনার API endpoint গুলো টেস্ট করুন।&lt;/p&gt;

&lt;p&gt;🔥 &lt;strong&gt;সংক্ষেপে RESTful API তৈরি করার ধাপ:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdcuz0bsjy3uq8603reg8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdcuz0bsjy3uq8603reg8.png" alt=" " width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔚 &lt;strong&gt;উপসংহার:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel-এ RESTful API বানানো খুবই সহজ এবং শক্তিশালী। Route, Controller, Model, Validation ও Response handling-এ Laravel এর বিল্ট-ইন সুবিধা API ডেভেলপমেন্টকে অনেক দ্রুততর করে দেয়।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;&lt;em&gt;প্রশ্ন ১৪&lt;/em&gt;&lt;/strong&gt;: API Resources কী, এবং Laravel-এ আপনি কীভাবে এগুলো ব্যবহার করবেন?&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;API Resources কী?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel API Resources হলো &lt;code&gt;JSON রেসপন্স ফরম্যাট করার একটি সুবিধাজনক পদ্ধতি।&lt;/code&gt;&lt;br&gt;
এগুলো ডেটাকে কাঠামোগত, পরিষ্কার এবং কাস্টমাইজড আকারে API রেসপন্স হিসেবে রিটার্ন করতে সাহায্য করে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;কেন API Resource ব্যবহার করবেন?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API রেসপন্সে শুধু প্রয়োজনীয় ডেটা দেখাতে পারবেন।&lt;/li&gt;
&lt;li&gt;ডেটার ফরম্যাট কন্ট্রোল করতে পারবেন।&lt;/li&gt;
&lt;li&gt;Response consistency বজায় থাকে।&lt;/li&gt;
&lt;li&gt;Complex nested relationship গুলো সহজে ম্যানেজ করা যায়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔧 &lt;strong&gt;Laravel-এ API Resource তৈরি ও ব্যবহার করার ধাপ:&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;১. Resource ক্লাস তৈরি করা&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan make:resource PostResource
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;২. Resource ক্লাসে ডেটা ফরম্যাট করা&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;app/Http/Resources/PostResource.php&lt;/code&gt; ফাইলে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class PostResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id'       =&amp;gt; $this-&amp;gt;id,
            'title'    =&amp;gt; $this-&amp;gt;title,
            'content'  =&amp;gt; $this-&amp;gt;content,
            'created_at' =&amp;gt; $this-&amp;gt;created_at-&amp;gt;format('Y-m-d H:i:s'),
        ];
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;৩. Controller-এ Resource ব্যবহার করা&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use App\Http\Resources\PostResource;
use App\Models\Post;

class PostController extends Controller
{
    public function show($id)
    {
        $post = Post::findOrFail($id);
        return new PostResource($post);
    }

    public function index()
    {
        $posts = Post::all();
        return PostResource::collection($posts);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;৪. Nested Resource ব্যবহার (Optional)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function toArray($request)
{
    return [
        'id'      =&amp;gt; $this-&amp;gt;id,
        'title'   =&amp;gt; $this-&amp;gt;title,
        'author'  =&amp;gt; new UserResource($this-&amp;gt;whenLoaded('author')),
    ];
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;➕ &lt;strong&gt;Collection Resource&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel Resource Collections ব্যবহার করলে একাধিক রিসোর্সের জন্য কাস্টম লজিক যোগ করতে পারবেন।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan make:resource PostCollection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧠 সংক্ষেপে:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmj1kg55fwadu8x0pwd6q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmj1kg55fwadu8x0pwd6q.png" alt=" " width="800" height="234"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;&lt;em&gt;প্রশ্ন ১৫&lt;/em&gt;&lt;/strong&gt;: Laravel কীভাবে Exception (ত্রুটি) হ্যান্ডেল করে? এবং কীভাবে আপনি বিভিন্ন Exception-এর জন্য কাস্টম এরর পেজ বানাতে পারেন?&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;Laravel-এ Exception Handling কীভাবে কাজ করে?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel এর &lt;strong&gt;Exception Handling&lt;/strong&gt; মেকানিজম খুবই শক্তিশালী এবং ফ্লেক্সিবল।&lt;br&gt;
এটি app/Exceptions/Handler.php ফাইলে মূলত হ্যান্ডেল করা হয়।&lt;/p&gt;

&lt;p&gt;🛠️ &lt;strong&gt;Exception Handling এর মূল উপাদান:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;১. report() method&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exception লগ করার জন্য ব্যবহৃত হয় (Laravel ডিফল্টভাবে Log ফাইলে লেখে)।&lt;/li&gt;
&lt;li&gt;আপনি এখানে কাস্টম Exception লগ বা ৩য় পক্ষের সিস্টেমে যেমন Sentry, Bugsnag ইত্যাদিতে পাঠাতে পারেন।
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function report(Throwable $exception)
{
    parent::report($exception);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;২. render() method&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exception ক্যাপচার করে HTTP Response তৈরি করে।&lt;/li&gt;
&lt;li&gt;এখানে আপনি Exception অনুযায়ী আলাদা ভিউ বা JSON রেসপন্স দিতে পারেন।
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function render($request, Throwable $exception)
{
    return parent::render($request, $exception);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;✅ &lt;strong&gt;কাস্টম Exception হ্যান্ডলিং এবং এরর পেজ বানানো:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;১. কাস্টম Exception তৈরি করা&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan make:exception CustomException
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;app/Exceptions/CustomException.php:&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace App\Exceptions;

use Exception;

class CustomException extends Exception
{
    public function render($request)
    {
        return response()-&amp;gt;view('errors.custom', [], 500);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;২. Handler.php-তে Exception আলাদাভাবে হ্যান্ডল করা&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function render($request, Throwable $exception)
{
    if ($exception instanceof \App\Exceptions\CustomException) {
        return response()-&amp;gt;view('errors.custom', [], 500);
    }

    return parent::render($request, $exception);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;৩. ভিন্ন Exception-র জন্য আলাদা পেজ তৈরি করা&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel এ ডিফল্টভাবে কিছু error view থাকে &lt;code&gt;resources/views/errors/&lt;/code&gt; ফোল্ডারে যেমন:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;404.blade.php (Not Found)&lt;/li&gt;
&lt;li&gt;500.blade.php (Server Error)&lt;/li&gt;
&lt;li&gt;403.blade.php (Forbidden)&lt;/li&gt;
&lt;li&gt;419.blade.php (CSRF Token Mismatch)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;আপনি এগুলো কাস্টমাইজ করে নিজের মতো করতে পারেন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;৪. API Response এর জন্য Exception হ্যান্ডেল করা&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function render($request, Throwable $exception)
{
    if ($request-&amp;gt;wantsJson()) {
        if ($exception instanceof ModelNotFoundException) {
            return response()-&amp;gt;json(['error' =&amp;gt; 'Resource not found'], 404);
        }
        return response()-&amp;gt;json(['error' =&amp;gt; 'Server Error'], 500);
    }

    return parent::render($request, $exception);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔥 Laravel Exception Handling Summary:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4qsyuk75se37pqckswke.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4qsyuk75se37pqckswke.png" alt=" " width="800" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;➕ &lt;strong&gt;সংক্ষেপে:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Laravel exception গুলো central &lt;code&gt;Handler.php&lt;/code&gt;-তে ধরা হয়।&lt;/li&gt;
&lt;li&gt;আপনি নিজস্ব Exception class বানিয়ে আলাদা হ্যান্ডল করতে পারেন।&lt;/li&gt;
&lt;li&gt;ভিন্ন HTTP status code বা JSON response তৈরি করতে পারেন।&lt;/li&gt;
&lt;li&gt;ভিউ ফাইল কাস্টমাইজ করে error page সুন্দর করতে পারবেন।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;&lt;em&gt;প্রশ্ন ১৬&lt;/em&gt;&lt;/strong&gt;: Laravel-এ Logging System কীভাবে কাজ করে? এবং কীভাবে আপনি বিভিন্ন Log Channel কনফিগার করবেন?&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;Laravel Logging System কী?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel এর Logging সিস্টেম মূলত &lt;code&gt;Monolog লাইব্রেরি&lt;/code&gt; ব্যবহার করে, যা একটি জনপ্রিয় PHP logging লাইব্রেরি।&lt;/p&gt;

&lt;p&gt;Laravel Logging সিস্টেম ডেভেলপারদের ডিবাগ, এরর ট্র্যাকিং এবং ইনফরমেশন লগ করার জন্য সুবিধাজনক ব্যবস্থা দেয়।&lt;/p&gt;

&lt;p&gt;🛠️ &lt;strong&gt;Laravel-এ Logging এর মূল বৈশিষ্ট্য:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;সহজে লগ লেখা (info, warning, error, debug, critical ইত্যাদি)&lt;/li&gt;
&lt;li&gt;একাধিক Channel ব্যবহার করার সুযোগ (একই সাথে ফাইল, সিস্টেম লগ, Slack ইত্যাদিতে পাঠানো)&lt;/li&gt;
&lt;li&gt;বিভিন্ন কনফিগারেশন অপশন সহজে পরিবর্তনযোগ্য&lt;/li&gt;
&lt;li&gt;Custom Channel তৈরি করার সুবিধা&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔍 &lt;strong&gt;Laravel এ Log ব্যবহার করার মৌলিক পদ্ধতি&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use Illuminate\Support\Facades\Log;

Log::info('This is an info log');
Log::warning('This is a warning log');
Log::error('This is an error log');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚙️ &lt;strong&gt;Log Channel কনফিগারেশন&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel এর লগ কনফিগারেশন &lt;code&gt;config/logging.php&lt;/code&gt; ফাইলে থাকে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;১. Default Log Channel&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.env&lt;/code&gt; ফাইলে ডিফল্ট চ্যানেল সেট করা হয়:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LOG_CHANNEL=stack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;২. প্রধান কিছু Log Channel:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh2nzk57ix2twa3b9aoz6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh2nzk57ix2twa3b9aoz6.png" alt=" " width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;৩. উদাহরণ: Stack Channel কনফিগারেশন&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;config/logging.php&lt;/code&gt; থেকে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'channels' =&amp;gt; [
    'stack' =&amp;gt; [
        'driver' =&amp;gt; 'stack',
        'channels' =&amp;gt; ['daily', 'slack'],
        'ignore_exceptions' =&amp;gt; false,
    ],
    'daily' =&amp;gt; [
        'driver' =&amp;gt; 'daily',
        'path' =&amp;gt; storage_path('logs/laravel.log'),
        'level' =&amp;gt; 'debug',
        'days' =&amp;gt; 14,
    ],
    'slack' =&amp;gt; [
        'driver' =&amp;gt; 'slack',
        'url' =&amp;gt; env('LOG_SLACK_WEBHOOK_URL'),
        'username' =&amp;gt; 'Laravel Log',
        'emoji' =&amp;gt; ':boom:',
        'level' =&amp;gt; 'critical',
    ],
],
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;৪. Log Level গুলো:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;emergency&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;alert&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;critical&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;error&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;warning&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;notice&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;info&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;debug&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;৫. Custom Channel তৈরি করা&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'channels' =&amp;gt; [
    'custom' =&amp;gt; [
        'driver' =&amp;gt; 'monolog',
        'handler' =&amp;gt; Monolog\Handler\StreamHandler::class,
        'with' =&amp;gt; [
            'stream' =&amp;gt; storage_path('logs/custom.log'),
        ],
        'level' =&amp;gt; 'debug',
    ],
],
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧠 &lt;strong&gt;Laravel Logging ব্যবহার উদাহরণ:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Log::debug('Debug message');
Log::info('User logged in', ['user_id' =&amp;gt; $user-&amp;gt;id]);
Log::error('Something went wrong!');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;➕ &lt;strong&gt;সংক্ষেপে:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Logging System&lt;/code&gt; -&amp;gt; Monolog লাইব্রেরি ব্যবহার করে Laravel logging করে&lt;br&gt;
&lt;code&gt;Log Channel&lt;/code&gt; -&amp;gt; লগ লেখা কোথায় হবে তার নির্দেশনা (file, slack, syslog ইত্যাদি)&lt;br&gt;
&lt;code&gt;Default Channel&lt;/code&gt; -&amp;gt; &lt;code&gt;.env&lt;/code&gt; থেকে নির্ধারণ করা হয়&lt;br&gt;
&lt;code&gt;Stack Channel&lt;/code&gt; -&amp;gt; একাধিক channel একই সাথে ব্যবহার করা যায়&lt;br&gt;
&lt;code&gt;Log Levels&lt;/code&gt; -&amp;gt; error, warning, info, debug ইত্যাদি&lt;br&gt;
&lt;code&gt;Custom Channel&lt;/code&gt; -&amp;gt; নিজের মতো করে কাস্টম লগ চ্যানেল তৈরি করা যায়&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;&lt;em&gt;প্রশ্ন ১৭&lt;/em&gt;&lt;/strong&gt;: Laravel অ্যাপলিকেশন ডেপ্লয় করার প্রক্রিয়া ব্যাখ্যা করুন। আপনি কোন টুল বা পদ্ধতি ব্যবহার করবেন?&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;Laravel অ্যাপ ডেপ্লয়মেন্ট কী?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ডেপ্লয়মেন্ট মানে হলো আপনার Laravel অ্যাপকে &lt;code&gt;লোকাল মেশিন থেকে লাইভ সার্ভার/প্রোডাকশন সার্ভারে স্থানান্তর করা&lt;/code&gt;, যাতে ইউজাররা অ্যাক্সেস করতে পারে।&lt;/p&gt;

&lt;p&gt;🔧 &lt;strong&gt;Laravel ডেপ্লয়মেন্টের ধাপসমূহ (সাধারণ নিয়ম):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;১. প্রোডাকশন সার্ভার প্রস্তুত করা&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;আপনি সার্ভার হিসেবে ব্যবহার করতে পারেন:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Shared Hosting&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VPS/Cloud Server&lt;/strong&gt; (e.g., DigitalOcean, AWS, Linode)&lt;/li&gt;
&lt;li&gt;Platform as a Service (&lt;strong&gt;PaaS&lt;/strong&gt;) – যেমন Heroku, Laravel Forge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;প্রয়োজনীয় সফটওয়্যার:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP (&amp;gt;=8.1)&lt;/li&gt;
&lt;li&gt;MySQL / MariaDB&lt;/li&gt;
&lt;li&gt;Nginx বা Apache&lt;/li&gt;
&lt;li&gt;Composer&lt;/li&gt;
&lt;li&gt;Laravel CLI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;২. কোড আপলোড করা&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;২টি জনপ্রিয় উপায়:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(ক) Git ব্যবহার করে (রেকমেন্ডেড)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/your-repo.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;(খ) FTP/SFTP বা cPanel File Manager দিয়ে কোড আপলোড করা&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;৩. Environment সেটআপ (.env ফাইল কনফিগার)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রোডাকশন সার্ভারের জন্য &lt;code&gt;.env&lt;/code&gt; ফাইল তৈরি করুন:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;APP_ENV=production
APP_DEBUG=false
APP_URL=https://yourdomain.com

DB_HOST=127.0.0.1
DB_DATABASE=your_db
DB_USERNAME=root
DB_PASSWORD=secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 &lt;strong&gt;৪. ডিপেনডেন্সি ইন্সটল করা&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;composer install --optimize-autoloader --no-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;--no-dev → ডেভেলপমেন্ট প্যাকেজ ইনস্টল হবে না&lt;/li&gt;
&lt;li&gt;--optimize-autoloader → ক্লাসলোডার অপটিমাইজ করে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;৫. APP Key জেনারেট করা&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan key:generate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 &lt;strong&gt;৬. Storage Permission দেওয়া&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chmod -R 775 storage
chmod -R 775 bootstrap/cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 &lt;strong&gt;৭. মাইগ্রেশন চালানো&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan migrate --force
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--force&lt;/code&gt; দিয়ে নিশ্চিত করে প্রোডাকশন সার্ভারে মাইগ্রেশন হবে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;৮. ক্যাশ অপটিমাইজ করা&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan config:cache
php artisan route:cache
php artisan view:cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 &lt;strong&gt;৯. Queue Worker চালানো (যদি queue ব্যবহার করেন)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan queue:work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;বা Supervisor দিয়ে manage করুন।&lt;/p&gt;

&lt;p&gt;🛠️ &lt;strong&gt;Laravel Deployment Tools (পছন্দ অনুযায়ী):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvcc4f9p28fggr4yv4ocb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvcc4f9p28fggr4yv4ocb.png" alt=" " width="800" height="311"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🧪 &lt;strong&gt;Deployment Checklist (সংক্ষেপে):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ধাপ   কাজ&lt;br&gt;
✅ Server Setup -&amp;gt; PHP, DB, Composer ইনস্টল&lt;br&gt;
✅ Code Upload -&amp;gt;  Git clone / FTP&lt;br&gt;
✅ .env Config -&amp;gt;  Production অনুযায়ী&lt;br&gt;
✅ Composer Install -&amp;gt; Dependencies ইনস্টল&lt;br&gt;
✅ Storage Permission -&amp;gt;   লেখার পারমিশন দিন&lt;br&gt;
✅ DB Migrate -&amp;gt;   Artisan দিয়ে&lt;br&gt;
✅ Optimize -&amp;gt; config, route, view cache&lt;br&gt;
✅ Supervisor (Queue) -&amp;gt;   worker চালু করুন (যদি প্রযোজ্য হয়)&lt;/p&gt;

&lt;p&gt;🏁 &lt;strong&gt;উপসংহার:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel অ্যাপ ডেপ্লয় করতে হলে আপনাকে শুধু কোড হোস্ট করলেই হবে না, বরং সঠিকভাবে সার্ভার সেটআপ, &lt;code&gt;.env&lt;/code&gt; কনফিগার, পারমিশন, মাইগ্রেশন, ক্যাশ এবং পারফরম্যান্স অপটিমাইজ করাও খুব গুরুত্বপূর্ণ।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;&lt;em&gt;প্রশ্ন ১৮&lt;/em&gt;&lt;/strong&gt;: Laravel-এ environment-specific configuration কীভাবে হ্যান্ডেল করা হয়?&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;Environment-specific configuration মানে কী?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel অ্যাপটি বিভিন্ন পরিবেশে (&lt;strong&gt;environment&lt;/strong&gt;) কাজ করতে পারে — যেমন:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;local&lt;/code&gt; (ডেভেলপমেন্ট)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;staging&lt;/code&gt; (পরীক্ষা)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;production&lt;/code&gt; (লাইভ)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Environment-specific configuration&lt;/strong&gt; মানে প্রতিটি environment অনুযায়ী আলাদা আলাদা সেটিংস ব্যবহার করা।&lt;/p&gt;

&lt;p&gt;🔧 &lt;strong&gt;Laravel কীভাবে Environment ডিফাইন করে?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel &lt;code&gt;APP_ENV&lt;/code&gt;variable ব্যবহার করে environment চিনে।&lt;/p&gt;

&lt;p&gt;📁 &lt;code&gt;.env&lt;/code&gt; ফাইলে আপনি সেট করতে পারেন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;APP_ENV=local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📁 &lt;strong&gt;.env ফাইল ব্যবহার করে কনফিগারেশন ম্যানেজমেন্ট&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.env&lt;/code&gt; ফাইল Laravel অ্যাপের গোপন ও পরিবেশ-নির্ভর তথ্য সংরক্ষণ করে। যেমন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;APP_NAME=MyApp
APP_ENV=production
APP_KEY=base64:...
APP_DEBUG=false
APP_URL=https://example.com

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=myapp
DB_USERNAME=root
DB_PASSWORD=secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔄 &lt;strong&gt;এই &lt;code&gt;.env&lt;/code&gt; ফাইল থেকে কনফিগারেশন কিভাবে পাওয়া যায়?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel এর কনফিগ ফাইলগুলো (যেমন &lt;code&gt;config/app.php&lt;/code&gt;, &lt;code&gt;config/database.php&lt;/code&gt;) &lt;code&gt;.env&lt;/code&gt; থেকে &lt;code&gt;env()&lt;/code&gt; ফাংশনের মাধ্যমে মান নিয়ে আসে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'debug' =&amp;gt; env('APP_DEBUG', false),
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🗂️ Environment Specific Config ব্যবহার করার উপায়:&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;১. বিভিন্ন .env ফাইল তৈরি করা (স্টেজ অনুযায়ী)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.env         ← local environment
.env.staging ← staging server
.env.production ← live server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;২. Git-এ .env ফাইল রাখা উচিত না&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.gitignore&lt;/code&gt; ফাইলে &lt;code&gt;.env&lt;/code&gt; রাখা থাকে, যেন এটা version control-এ না যায়।&lt;/p&gt;

&lt;p&gt;🛠️ &lt;strong&gt;Environment Configuration ব্যবহারের ব্যবহারিক ক্ষেত্র:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foo3jzu9eh6ozozxovtr3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foo3jzu9eh6ozozxovtr3.png" alt=" " width="800" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;চাইলে কোডের ভিতরে environment চেক করতেও পারেন&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (app()-&amp;gt;environment('local')) {
    // Local environment-specific logic
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;বা&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (App::environment(['staging', 'production'])) {
    // For both staging and production
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔄 &lt;strong&gt;কনফিগারেশন ক্যাশ ক্লিয়ার এবং রিফ্রেশ করার কমান্ড:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan config:clear
php artisan config:cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧪 &lt;strong&gt;উপসংহার (Summary):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh5scdj1ko76s8uoilf43.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh5scdj1ko76s8uoilf43.png" alt=" " width="800" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;&lt;em&gt;প্রশ্ন ১৯&lt;/em&gt;&lt;/strong&gt;: ওয়েব অ্যাপ্লিকেশনে সাধারণ সিকিউরিটি দুর্বলতাগুলোর আলোচনা করুন এবং Laravel কীভাবে এই ঝুঁকিগুলো প্রতিরোধ করে তা ব্যাখ্যা করুন।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔐 &lt;strong&gt;সাধারণ ওয়েব সিকিউরিটি ভলনারেবিলিটি (Vulnerabilities):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ওয়েব অ্যাপ্লিকেশন সাধারণত নিচের নিরাপত্তা সমস্যার মুখোমুখি হয়:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb2uzafqxatbq25uoayeo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb2uzafqxatbq25uoayeo.png" alt=" " width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Laravel কীভাবে এসব সমস্যার সমাধান করে:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔐 &lt;strong&gt;১. SQL Injection – সমাধান: Eloquent ও Query Builder&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel এর Eloquent ORM এবং Query Builder ব্যবহার করলে ডিফল্টভাবে &lt;strong&gt;prepared statements&lt;/strong&gt; তৈরি হয়।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// নিরাপদ
$user = DB::table('users')-&amp;gt;where('email', $email)-&amp;gt;first();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔰 &lt;strong&gt;ইনপুট সরাসরি SQL তে বসালে ইনজেকশন হয় না।&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔐 &lt;strong&gt;২. XSS (Cross-site scripting) – সমাধান: Blade Escaping&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel এর Blade টেমপ্লেট ইঞ্জিন স্বয়ংক্রিয়ভাবে HTML encode করে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{ $userInput }} {{-- নিরাপদ --}}
{!! $userInput !!} {{-- সাবধানে ব্যবহার করতে হবে --}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔰 Blade এ &lt;code&gt;{{ }}&lt;/code&gt; ব্যবহার করলে JavaScript ইনজেকশন প্রতিরোধ হয়।&lt;/p&gt;

&lt;p&gt;🔐 &lt;strong&gt;৩. CSRF (Cross-site request forgery) – সমাধান: CSRF Token&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel স্বয়ংক্রিয়ভাবে ফর্মে CSRF টোকেন যুক্ত করে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;form method="POST" action="/submit"&amp;gt;
    @csrf
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔰 Laravel এর middleware &lt;code&gt;VerifyCsrfToken&lt;/code&gt; এই টোকেন যাচাই করে।&lt;/p&gt;

&lt;p&gt;🔐 &lt;strong&gt;৪. Mass Assignment – সমাধান: Fillable বা Guarded&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel এ mass assignment থেকে রক্ষা করতে &lt;code&gt;fillable&lt;/code&gt; বা &lt;code&gt;guarded&lt;/code&gt; প্রপার্টি ব্যবহার করা হয়।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// সঠিক
protected $fillable = ['name', 'email'];

// না চাইলে সব ব্লক
protected $guarded = ['is_admin'];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔰 এটা prevents করে ইউজার ইনপুট থেকে অবাঞ্ছিত ফিল্ড আপডেট হওয়া।&lt;/p&gt;

&lt;p&gt;🔐 &lt;strong&gt;৫. Password Hashing – সমাধান: bcrypt / Hash ফ্যাসাড&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel এ পাসওয়ার্ড এনক্রিপ্ট করার জন্য &lt;code&gt;bcrypt()&lt;/code&gt; বা &lt;code&gt;Hash&lt;/code&gt; ফ্যাসাড ব্যবহার করা হয়।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use Illuminate\Support\Facades\Hash;

$user-&amp;gt;password = Hash::make($request-&amp;gt;password);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔰 পাসওয়ার্ড কখনো প্লেইন টেক্সটে সংরক্ষণ করা উচিত না।&lt;/p&gt;

&lt;p&gt;🔐 &lt;strong&gt;৬. File Upload Protection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel ফাইল আপলোড করার সময় মাইম টাইপ, এক্সটেনশন, ও ফাইল সাইজ যাচাই করার সুবিধা দেয়।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$request-&amp;gt;validate([
    'photo' =&amp;gt; 'required|image|mimes:jpg,png,jpeg|max:2048',
]);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔰 এই ভ্যালিডেশন ম্যালিসিয়াস স্ক্রিপ্ট বা exe ফাইল ব্লক করে।&lt;/p&gt;

&lt;p&gt;🔐 &lt;strong&gt;৭. Secure Redirects&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel এর &lt;code&gt;redirect()&lt;/code&gt; ফাংশন শুধু অনুমোদিত URL-এ পাঠাতে সাহায্য করে।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return redirect()-&amp;gt;intended('/dashboard');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔰 আপনার ইচ্ছেমতো রিডিরেক্ট না করে, এটি আগে নির্ধারিত route এ পাঠায়।&lt;/p&gt;

&lt;p&gt;✨ &lt;strong&gt;Laravel আরও যেসব নিরাপত্তা সুবিধা দেয়:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbork83em17hou1yiivv8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbork83em17hou1yiivv8.png" alt=" " width="800" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🧪 &lt;strong&gt;উপসংহার:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0izctcburcpwoggypl6n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0izctcburcpwoggypl6n.png" alt=" " width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Laravel ডেভেলপারদের সিকিউরিটি নিয়ে সচেতন থাকতে হয় এবং Laravel-এর বিল্ট-ইন সুবিধাগুলো ঠিকভাবে ব্যবহার করলেই অনেক নিরাপত্তা ঝুঁকি দূর হয়।&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;&lt;em&gt;প্রশ্ন ২০&lt;/em&gt;&lt;/strong&gt;: Laravel অ্যাপ্লিকেশনে SQL Injection আক্রমণ প্রতিরোধে আপনি কী কী ব্যবস্থা নেবেন?&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔍 &lt;strong&gt;SQL Injection কী?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SQL Injection হলো একটি &lt;strong&gt;ভালনারেবিলিটি&lt;/strong&gt;, যেখানে ইউজার ইনপুটের মাধ্যমে &lt;strong&gt;ডাটাবেজে ক্ষতিকর SQL কমান্ড ইনজেক্ট&lt;/strong&gt; করা যায়। এর মাধ্যমে হ্যাকার:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ডাটা চুরি করতে পারে&lt;/li&gt;
&lt;li&gt;ডাটা মুছে ফেলতে পারে&lt;/li&gt;
&lt;li&gt;অথরাইজড না হয়েও ডাটাবেজ অ্যাক্সেস করতে পারে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔐 &lt;strong&gt;Laravel কীভাবে SQL Injection থেকে রক্ষা করে?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel ডিফল্টভাবে SQL Injection প্রতিরোধ করে নিচের টেকনিকগুলো ব্যবহার করে:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;১. Eloquent ORM ব্যবহার করা&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Eloquent ব্যবহার করলে ইনপুট স্বয়ংক্রিয়ভাবে bind হয়, যেখানে injection সম্ভব হয় না।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// নিরাপদ
$user = User::where('email', $request-&amp;gt;email)-&amp;gt;first();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔒 এখানে &lt;code&gt;$request-&amp;gt;email&lt;/code&gt; ডিরেক্ট SQL-এ না গিয়ে bind হয়ে যায়।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;২. Query Builder ব্যবহার করা&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel এর Query Builder &lt;code&gt;where()&lt;/code&gt; ইত্যাদি মেথড ব্যবহার করলে prepared statements তৈরি হয়।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$user = DB::table('users')-&amp;gt;where('name', $request-&amp;gt;name)-&amp;gt;get();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔒 এখানেও &lt;code&gt;$request-&amp;gt;name&lt;/code&gt; SQL string হিসেবে ইনজেক্ট হতে পারে না।&lt;/p&gt;

&lt;p&gt;🚫 &lt;strong&gt;৩. Raw SQL ব্যবহার করলে bind করতে হবে&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;যদি আপনি raw SQL চালাতে চান, তাহলে &lt;strong&gt;parameter binding&lt;/strong&gt; ব্যবহার করতে হবে।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// ❌ ঝুঁকিপূর্ণ: ইউজার ইনপুট ডিরেক্ট বসানো হয়েছে
DB::select("SELECT * FROM users WHERE name = '$name'");

// ✅ নিরাপদ (bindings সহ)
DB::select("SELECT * FROM users WHERE name = ?", [$name]);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;৪. Mass Assignment প্রতিরোধ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mass assignment থেকে SQL injection হতে পারে যদি আপনি &lt;code&gt;$fillable/$guarded&lt;/code&gt; না ব্যবহার করেন।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// ✅ নিরাপদ
protected $fillable = ['name', 'email'];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔒 না দিলে malicious ফর্ম ইনপুট sensitive ফিল্ডে ইনজেক্ট হতে পারে।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;৫. Request Validation ব্যবহার করা&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ফর্ম ইনপুট ভ্যালিড না হলে তা SQL-এ পৌঁছানোর আগেই ব্লক হয়ে যায়।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$request-&amp;gt;validate([
    'email' =&amp;gt; 'required|email',
    'name' =&amp;gt; 'required|string|max:255',
]);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;৬. Stored Procedure ও ORM মিলিয়ে ব্যবহার করা (Optional Advanced)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel থেকে ডাটাবেজের stored procedures ব্যবহার করা যায়, যাতে সরাসরি ইনজেকশন প্রতিরোধ হয়।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DB::statement('CALL safeProcedure(?, ?)', [$val1, $val2]);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧪 &lt;strong&gt;সংক্ষেপে প্রতিরোধমূলক ব্যবস্থা:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgrqqjfgprjvfmudzwzcw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgrqqjfgprjvfmudzwzcw.png" alt=" " width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🏁 &lt;strong&gt;উপসংহার&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Laravel এর ডিফল্ট ORM ও Query Builder ব্যবহার করলে আপনি SQL Injection থেকে অনেকটাই নিরাপদ। তবে কখনো raw SQL ব্যবহার করলে অবশ্যই &lt;code&gt;bindings&lt;/code&gt; ব্যবহার করতে হবে। এবং সর্বদা &lt;strong&gt;ভ্যালিডেশন, ফিল্টারিং, ও সঠিক মডেল ফিল্ড নিয়ন্ত্রণ&lt;/strong&gt; করা উচিত।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;&lt;em&gt;প্রশ্ন ২১&lt;/em&gt;&lt;/strong&gt;: একটি PHP ফাংশন লিখুন যা একটি সংখ্যার সেট থেকে সব সম্ভাব্য কম্বিনেশন খুঁজে বের করে যেগুলোর যোগফল একটি নির্দিষ্ট টার্গেটের সমান হয়। নিশ্চিত করুন যে এটি বড় ইনপুট অ্যারে হ্যান্ডেল করতে দক্ষতার সাথে কাজ করে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ইনপুট: [2, 3, 5, 7], target = 8  
আউটপুট: [[3, 5], [2, 3, 3]]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;সমাধান&lt;/strong&gt; (&lt;strong&gt;PHP কোড সহ&lt;/strong&gt;):&lt;/p&gt;

&lt;p&gt;আমরা এখানে &lt;strong&gt;ব্যাকট্র্যাকিং&lt;/strong&gt; ও &lt;strong&gt;মেমোইজেশন&lt;/strong&gt; ব্যবহার করব যাতে কম্বিনেশন খুঁজে বের করতে পারি এবং বারবার একই উপসমস্যা না করি।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function combinationSum(array $candidates, int $target): array {
    sort($candidates); // Optional but helps avoid duplicate combinations
    $result = [];
    $memo = [];

    function dfs($candidates, $target, $start, $path, &amp;amp;$result, &amp;amp;$memo) {
        $key = $target . '-' . implode(',', $path);
        if (isset($memo[$key])) return;

        if ($target == 0) {
            $result[] = $path;
            return;
        }

        for ($i = $start; $i &amp;lt; count($candidates); $i++) {
            if ($candidates[$i] &amp;gt; $target) break;

            dfs($candidates, $target - $candidates[$i], $i, array_merge($path, [$candidates[$i]]), $result, $memo);
        }

        $memo[$key] = true;
    }

    dfs($candidates, $target, 0, [], $result, $memo);
    return $result;
}

// ✅ উদাহরণ চালানো:
$candidates = [2, 3, 5, 7];
$target = 8;
print_r(combinationSum($candidates, $target));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧠 &lt;strong&gt;কীভাবে কাজ করে:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dfs()&lt;/code&gt; ফাংশনটি রিকার্সিভলি প্রতিটি সম্ভাব্য সংখ্যার সমন্বয় পরীক্ষা করে।&lt;/li&gt;
&lt;li&gt;একই সাব-প্রোব্লেম আবার না করতে &lt;code&gt;memo&lt;/code&gt; অ্যারে ব্যবহার করছি।&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;start&lt;/code&gt; ইনডেক্স দিয়ে পরবর্তী রিকর্শনে পুনরাবৃত্তি নিয়ন্ত্রণ করা হয় যাতে ডুপ্লিকেট কম্বিনেশন না আসে।&lt;/li&gt;
&lt;li&gt;যদি &lt;code&gt;target == 0&lt;/code&gt; হয়, তাহলে এটি একটি ভ্যালিড কম্বিনেশন এবং তা &lt;code&gt;result&lt;/code&gt; এ যোগ করা হয়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚡️ &lt;strong&gt;বড় ইনপুটে পারফরম্যান্স টিপস:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;sort()&lt;/code&gt; করলে লুপে আগেই বড় সংখ্যাগুলো বাদ দেয়া যায় (&lt;code&gt;if ($candidates[$i] &amp;gt; $target) break;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;memoization&lt;/code&gt; এর ফলে একই কম্বিনেশন বারবার চেক করতে হয় না।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📤 &lt;strong&gt;উদাহরণ আউটপুট&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Array
(
    [0] =&amp;gt; Array
        (
            [0] =&amp;gt; 2
            [1] =&amp;gt; 3
            [2] =&amp;gt; 3
        )

    [1] =&amp;gt; Array
        (
            [0] =&amp;gt; 3
            [1] =&amp;gt; 5
        )
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;&lt;em&gt;প্রশ্ন ২২&lt;/em&gt;&lt;/strong&gt;: Laravel-এর Eloquent ORM ব্যবহার করে একটি কুয়েরি লিখুন যা নিচের তথ্য ফিরিয়ে দেয়:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;গত ৩০ দিনের মধ্যে যেসব ইউজার $1,000+ অর্ডার করেছেন তাদের তালিকা&lt;/li&gt;
&lt;li&gt;প্রত্যেক ইউজারের মোট অর্ডার অ্যামাউন্ট ও অর্ডার সংখ্যা&lt;/li&gt;
&lt;li&gt;তাদের প্রোফাইল ও সর্বশেষ অর্ডার &lt;strong&gt;eager load&lt;/strong&gt; করতে হবে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🧩 &lt;strong&gt;ধরা যাক আপনার মডেল গুলো এমন:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;User&lt;/code&gt; মডেলের সাথে &lt;code&gt;orders(), profile()&lt;/code&gt; রিলেশন আছে&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Order&lt;/code&gt; মডেলের &lt;code&gt;amount, created_at&lt;/code&gt; ফিল্ড আছে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Laravel Eloquent ORM কোড:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
use App\Models\User;

$users = User::whereHas('orders', function ($query) {
        $query-&amp;gt;where('created_at', '&amp;gt;=', now()-&amp;gt;subDays(30));
    })
    -&amp;gt;withSum(['orders' =&amp;gt; function ($query) {
        $query-&amp;gt;where('created_at', '&amp;gt;=', now()-&amp;gt;subDays(30));
    }], 'amount')
    -&amp;gt;withCount(['orders' =&amp;gt; function ($query) {
        $query-&amp;gt;where('created_at', '&amp;gt;=', now()-&amp;gt;subDays(30));
    }])
    -&amp;gt;with(['profile', 'orders' =&amp;gt; function ($query) {
        $query-&amp;gt;latest()-&amp;gt;limit(1);
    }])
    -&amp;gt;get()
    -&amp;gt;filter(function ($user) {
        return $user-&amp;gt;orders_sum_amount &amp;gt; 1000;
    });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧠 &lt;strong&gt;কী হয়েছে এখানে:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmjyvt618qza0l2pxi8al.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmjyvt618qza0l2pxi8al.png" alt=" " width="800" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📝 &lt;strong&gt;নোট&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;orders_sum_amount&lt;/code&gt; এবং &lt;code&gt;orders_count&lt;/code&gt; অটো জেনারেটেড ফিল্ড Laravel-এর &lt;code&gt;withSum() ও withCount()&lt;/code&gt; থেকে আসে&lt;/li&gt;
&lt;li&gt;এখানে আমরা only those users রাখছি যাদের গত &lt;strong&gt;৩০ দিনের অর্ডার টোটাল &amp;gt; 1000&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;উদাহরণ রিটার্ন ভ্যালু:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[
  {
    "id" =&amp;gt; 1,
    "name" =&amp;gt; "Ruhul Amin",
    "orders_sum_amount" =&amp;gt; 1200,
    "orders_count" =&amp;gt; 3,
    "profile" =&amp;gt; [ ... ],
    "orders" =&amp;gt; [
      [ "id" =&amp;gt; 5, "amount" =&amp;gt; 700, "created_at" =&amp;gt; "..." ]
    ]
  },
  ...
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;&lt;em&gt;প্রশ্ন ২৩&lt;/em&gt;&lt;/strong&gt;: Laravel-এ একটি কাস্টম সার্ভিস তৈরি করুন যা বিভিন্ন salary heads (যেমন: basic pay, allowances, deductions) ব্যবহার করে কর্মচারীদের মাসিক বেতন গণনা করবে।&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;সার্ভিসটি সার্ভিস কন্টেইনারে bind করুন&lt;/li&gt;
&lt;li&gt;এটি একটি কন্ট্রোলারে inject করুন এবং ব্যবহার দেখান&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;ধাপে ধাপে সমাধান&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;🔧 &lt;strong&gt;Step 1: কাস্টম সার্ভিস ক্লাস তৈরি করুন&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan make:service SalaryCalculatorService
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔽 বা নিজে তৈরি করুন:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;📁 app/Services/SalaryCalculatorService.php&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace App\Services;

class SalaryCalculatorService
{
    public function calculate(array $salaryData): float
    {
        $basic = $salaryData['basic'] ?? 0;
        $allowances = $salaryData['allowances'] ?? 0;
        $deductions = $salaryData['deductions'] ?? 0;

        $totalSalary = $basic + $allowances - $deductions;

        return max($totalSalary, 0); // নেগেটিভ হলে ০ রিটার্ন
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧩 &lt;strong&gt;Step 2: সার্ভিস কন্টেইনারে bind করা&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;📁 &lt;code&gt;app/Providers/AppServiceProvider.php&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use App\Services\SalaryCalculatorService;

public function register(): void
{
    $this-&amp;gt;app-&amp;gt;bind(SalaryCalculatorService::class, function ($app) {
        return new SalaryCalculatorService();
    });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧪 &lt;strong&gt;Step 3: কন্ট্রোলারে ইনজেক্ট করে ব্যবহার করা&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan make:controller EmployeeController
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📁 &lt;code&gt;app/Http/Controllers/EmployeeController.php&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Services\SalaryCalculatorService;

class EmployeeController extends Controller
{
    protected $salaryCalculator;

    public function __construct(SalaryCalculatorService $salaryCalculator)
    {
        $this-&amp;gt;salaryCalculator = $salaryCalculator;
    }

    public function calculateSalary(Request $request)
    {
        $salaryData = $request-&amp;gt;only(['basic', 'allowances', 'deductions']);

        $monthlySalary = $this-&amp;gt;salaryCalculator-&amp;gt;calculate($salaryData);

        return response()-&amp;gt;json([
            'monthly_salary' =&amp;gt; $monthlySalary,
        ]);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔗 &lt;strong&gt;Step 4: রাউট যুক্ত করা&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;📁 &lt;code&gt;routes/web.php (বা api.php)&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use App\Http\Controllers\EmployeeController;

Route::post('/calculate-salary', [EmployeeController::class, 'calculateSalary']);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;উদাহরণ ইনপুট (POST Request):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "basic": 20000,
  "allowances": 5000,
  "deductions": 3000
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Response&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "monthly_salary": 22000
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧠 &lt;strong&gt;টিপস&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;চাইলে আপনি SalaryCalculatorService-এ &lt;code&gt;calculateAnnual()&lt;/code&gt; বা &lt;code&gt;generatePayslip()&lt;/code&gt; মেথডও যোগ করতে পারেন।&lt;/li&gt;
&lt;li&gt;সার্ভিসকে ইন্টারফেস দিয়ে bind করলেও ভালো practice হয়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;&lt;em&gt;প্রশ্ন ২৪&lt;/em&gt;&lt;/strong&gt;: Laravel-এর Broadcasting ফিচার ব্যবহার করে একটি রিয়েল-টাইম Notification System তৈরি করুন।&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;একটি নতুন ব্লগ পোস্ট পাবলিশ হলে একটি Event ট্রিগার করুন&lt;/li&gt;
&lt;li&gt;Pusher বা Laravel Echo দিয়ে সকল কানেক্টেড ইউজারকে তাৎক্ষণিক নোটিফিকেশন পাঠান&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;ধাপে ধাপে সমাধান&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;🔧 &lt;strong&gt;Step 1: Laravel Broadcast সাপোর্ট চালু&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;📄 &lt;code&gt;.env&lt;/code&gt; ফাইলে যুক্ত করুন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BROADCAST_DRIVER=pusher
PUSHER_APP_ID=your_app_id
PUSHER_APP_KEY=your_app_key
PUSHER_APP_SECRET=your_app_secret
PUSHER_APP_CLUSTER=mt1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📄 &lt;code&gt;config/broadcasting.php:&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'default' =&amp;gt; env('BROADCAST_DRIVER', 'null'),
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📦 &lt;strong&gt;Step 2: প্রয়োজনীয় প্যাকেজ ইনস্টল করুন&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;composer require pusher/pusher-php-server
npm install --save laravel-echo pusher-js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚡️ &lt;strong&gt;Step 3: ইভেন্ট তৈরি করুন&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan make:event NewBlogPostPublished
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📁 &lt;code&gt;app/Events/NewBlogPostPublished.php&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace App\Events;

use App\Models\Post;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class NewBlogPostPublished implements ShouldBroadcast
{
    use InteractsWithSockets, SerializesModels;

    public $post;

    public function __construct(Post $post)
    {
        $this-&amp;gt;post = $post;
    }

    public function broadcastOn()
    {
        return new Channel('blog-posts');
    }

    public function broadcastAs()
    {
        return 'new-post';
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✍️ &lt;strong&gt;Step 4: পোস্ট পাবলিশে ইভেন্ট ট্রিগার করুন&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;📁 &lt;code&gt;app/Http/Controllers/PostController.php&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use App\Models\Post;
use App\Events\NewBlogPostPublished;

public function store(Request $request)
{
    $post = Post::create($request-&amp;gt;all());

    broadcast(new NewBlogPostPublished($post))-&amp;gt;toOthers();

    return response()-&amp;gt;json(['message' =&amp;gt; 'Post published!']);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧪 &lt;strong&gt;Step 5: ফ্রন্টএন্ড (Laravel Echo + Pusher)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;📄 &lt;code&gt;resources/js/bootstrap.js বা resources/js/app.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import Echo from 'laravel-echo';
import Pusher from 'pusher-js';

window.Pusher = Pusher;

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: import.meta.env.VITE_PUSHER_APP_KEY,
    cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER,
    forceTLS: true
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📄 &lt;code&gt;Component বা Script-এ:&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Echo.channel('blog-posts')
    .listen('.new-post', (e) =&amp;gt; {
        console.log('🎉 নতুন পোস্ট:', e.post.title);
        alert('New Blog Post: ' + e.post.title);
    });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📡 &lt;strong&gt;Step 6: Laravel WebSocket চালু (Local Test এর জন্য)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;composer require beyondcode/laravel-websockets
php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider"
php artisan migrate
php artisan websockets:serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;উপসংহার&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzszk0zs7bkcz7gw23lgk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzszk0zs7bkcz7gw23lgk.png" alt=" " width="800" height="197"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;অতিরিক্ত টিপস&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;যদি আপনি লগইন ইউজারের জন্য ব্যক্তিগত চ্যানেল চান, তাহলে &lt;code&gt;PrivateChannel&lt;/code&gt; ব্যবহার করুন।&lt;/li&gt;
&lt;li&gt;উন্নত ব্যবস্থার জন্য &lt;code&gt;Notification&lt;/code&gt; ক্লাস বা &lt;code&gt;laravel-notification-channels&lt;/code&gt; ইউজ করা যায়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;&lt;em&gt;প্রশ্ন ২৫&lt;/em&gt;&lt;/strong&gt;: Laravel-এ একটি &lt;code&gt;custom validation rule&lt;/code&gt; তৈরি করুন যা Social Security Number (SSN) এর ফরম্যাট (যেমন &lt;code&gt;123-45-6789&lt;/code&gt;) যাচাই করবে।&lt;br&gt;
পাশাপাশি, একই ফরম্যাট যাচাইয়ের জন্য একটি Raw PHP ফাংশন লিখুন।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🟦 &lt;strong&gt;১) Laravel Custom Validation Rule&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔧 &lt;strong&gt;ধাপ ১: রুল তৈরি করুন&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan make:rule ValidSSN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📁 &lt;code&gt;app/Rules/ValidSSN.php&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class ValidSSN implements Rule
{
    public function passes($attribute, $value)
    {
        // Valid SSN format: 123-45-6789
        return preg_match('/^\d{3}-\d{2}-\d{4}$/', $value);
    }

    public function message()
    {
        return 'The :attribute must be a valid SSN format (e.g. 123-45-6789).';
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📥 &lt;strong&gt;ধাপ ২: রুল ব্যবহার করুন ফর্ম রিকুয়েস্ট বা কন্ট্রোলারে&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;উদাহরণ – Controller:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use App\Rules\ValidSSN;

public function store(Request $request)
{
    $request-&amp;gt;validate([
        'ssn' =&amp;gt; ['required', new ValidSSN()],
    ]);

    // valid হলে ডেটা সেভ করুন
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🟩 &lt;strong&gt;২) Raw PHP Function (SSN ফরম্যাট যাচাই)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function isValidSSN($ssn)
{
    return preg_match('/^\d{3}-\d{2}-\d{4}$/', $ssn);
}

// ✅ উদাহরণ
$ssn1 = "123-45-6789";
$ssn2 = "12-345-6789";

echo isValidSSN($ssn1) ? "Valid" : "Invalid"; // Valid
echo isValidSSN($ssn2) ? "Valid" : "Invalid"; // Invalid
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;সংক্ষেপে&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1bkyidboh5getjugyk1n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1bkyidboh5getjugyk1n.png" alt=" " width="800" height="92"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;&lt;em&gt;প্রশ্ন ২৬&lt;/em&gt;&lt;/strong&gt;: Using Laravel's Cache facade, optimize a scenario where API responses are cached for frequent requests but invalidated whenever the corresponding database table is updated.&lt;/p&gt;

&lt;p&gt;Use PHP's Redis extension for caching.Implement a fallback for file-based caching if Redis isn't available.&lt;/p&gt;

&lt;p&gt;যেখানে Laravel Cache Facade ব্যবহার করে API রেসপন্স ক্যাশ করা হয়েছে এবং ডাটাবেজ আপডেট হলেই ক্যাশ ইনভ্যালিড হচ্ছে। Redis ব্যবহার করা হয়েছে এবং Redis না থাকলে file-based fallback ও যুক্ত আছে।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;লক্ষ্য&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API রেসপন্স ক্যাশ করতে হবে&lt;/li&gt;
&lt;li&gt;ক্যাশ তখনই ইনভ্যালিড হবে যখন ডাটাবেজ আপডেট হয়&lt;/li&gt;
&lt;li&gt;Redis ব্যবহার করব, কিন্তু Redis না থাকলে file fallback হবে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔧 &lt;strong&gt;ধাপ ১: &lt;code&gt;.env&lt;/code&gt; ও &lt;code&gt;cache.php&lt;/code&gt; ফাইল কনফিগার করুন&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;&lt;code&gt;.env&lt;/code&gt; ফাইলে যুক্ত করুন:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CACHE_DRIVER=redis
REDIS_CLIENT=phpredis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;code&gt;config/cache.php&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'default' =&amp;gt; env('CACHE_DRIVER', 'file'), // Redis না থাকলে fallback 'file'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Laravel স্বয়ংক্রিয়ভাবে fallback cache ব্যবহার করে।&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;📦 &lt;strong&gt;ধাপ ২: Redis সেটআপ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Redis ইন্সটল করুন (উবুন্টু)&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install redis
sudo systemctl enable redis
sudo systemctl start redis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Laravel Redis প্যাকেজ আগে থেকেই অন্তর্ভুক্ত থাকে। তবে নিশ্চিত করতে পারেন:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;composer require predis/predis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔁 &lt;strong&gt;ধাপ ৩: API রেসপন্স ক্যাশ করুন&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ধরি &lt;code&gt;/api/products&lt;/code&gt; রাউট রয়েছে।&lt;/p&gt;

&lt;p&gt;📁 &lt;code&gt;ProductController.php&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use Illuminate\Support\Facades\Cache;
use App\Models\Product;

public function index()
{
    $cacheKey = 'products.all';

    // Redis/File Cache থেকে রেসপন্স নেওয়া, না থাকলে DB থেকে
    $products = Cache::remember($cacheKey, 60, function () {
        return Product::all();
    });

    return response()-&amp;gt;json($products);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧹 &lt;strong&gt;ধাপ ৪: ক্যাশ ইনভ্যালিড করা যখন ডেটা আপডেট হয়&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;📁 &lt;code&gt;ProductController.php&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function update(Request $request, $id)
{
    $product = Product::findOrFail($id);
    $product-&amp;gt;update($request-&amp;gt;all());

    // ক্যাশ ডিলিট
    Cache::forget('products.all');

    return response()-&amp;gt;json(['message' =&amp;gt; 'Product updated']);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এভাবে আপনি &lt;code&gt;store()&lt;/code&gt; বা &lt;code&gt;delete()&lt;/code&gt; মেথডেও &lt;code&gt;Cache::forget()&lt;/code&gt; যোগ করতে পারেন।&lt;/p&gt;




&lt;p&gt;🎯 &lt;strong&gt;Optional: Observer ব্যবহার করে অটো ক্যাশ ইনভ্যালিডেশন&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;📁 &lt;code&gt;app/Observers/ProductObserver.php&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace App\Observers;
use App\Models\Product;
use Illuminate\Support\Facades\Cache;

class ProductObserver
{
    public function saved(Product $product)
    {
        Cache::forget('products.all');
    }

    public function deleted(Product $product)
    {
        Cache::forget('products.all');
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📁 &lt;code&gt;AppServiceProvider.php&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use App\Models\Product;
use App\Observers\ProductObserver;

public function boot()
{
    Product::observe(ProductObserver::class);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧪 &lt;strong&gt;Bonus: Cache fallback যাচাই&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;আপনি Redis সার্ভার বন্ধ করে &lt;code&gt;file&lt;/code&gt; fallback কাজ করছে কিনা দেখুন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl stop redis
php artisan route:clear
php artisan config:clear
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;রান করলে Laravel নিজেই fallback ড্রাইভারে (file) চলে যাবে।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;সারসংক্ষেপ&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1gsro8lhgegph3i8h34t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1gsro8lhgegph3i8h34t.png" alt=" " width="800" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;&lt;em&gt;প্রশ্ন ২৭&lt;/em&gt;&lt;/strong&gt;: তুমি একটি Laravel কোড পেয়েছো যা অনেক ধীরগতিতে চলছে। নিচের কোডটি কীভাবে অপটিমাইজ করবে যাতে ডাটাবেজ কোয়েরির সংখ্যা কমানো যায়?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$orders = Order::where('status', 'completed')-&amp;gt;get();
foreach ($orders as $order) {
    $items = $order-&amp;gt;items;
    foreach ($items as $item) {
        $details = $item-&amp;gt;details;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;উপরের কোডটি &lt;strong&gt;N+1 Query Problem&lt;/strong&gt; এর শিকার। প্রতিটি &lt;code&gt;Order&lt;/code&gt; এর জন্য আলাদা করে &lt;code&gt;items&lt;/code&gt; এবং প্রতিটি &lt;code&gt;item&lt;/code&gt; এর জন্য আলাদা করে &lt;code&gt;details&lt;/code&gt; কুয়্যারি চালানো হচ্ছে। এর ফলে অনেকগুলো অপ্রয়োজনীয় ডাটাবেজ হিট হয়।&lt;/p&gt;

&lt;p&gt;🔧 &lt;strong&gt;সমাধান: Eager Loading ব্যবহার করুন&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel-এর &lt;code&gt;with()&lt;/code&gt; মেথড ব্যবহার করে আমরা প্রয়োজনীয় রিলেশনগুলো &lt;strong&gt;একসাথে লোড&lt;/strong&gt; করতে পারি।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;অপটিমাইজড কোড:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$orders = Order::with('items.details')
    -&amp;gt;where('status', 'completed')
    -&amp;gt;get();

foreach ($orders as $order) {
    foreach ($order-&amp;gt;items as $item) {
        $details = $item-&amp;gt;details;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧠 ব্যাখ্যা:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fir03y66h55lru5nx2si1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fir03y66h55lru5nx2si1.png" alt=" " width="800" height="174"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔍 &lt;strong&gt;ফলাফল&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance বৃদ্ধি&lt;/strong&gt; পাবে&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Query সংখ্যা কমবে&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Efficient&lt;/strong&gt; হবে&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ডেটা একসাথে ক্যাশে থাকতে পারবে&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ সংক্ষেপে:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm1t1ldq91rp7y8w1y7o6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm1t1ldq91rp7y8w1y7o6.png" alt=" " width="800" height="177"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;&lt;em&gt;প্রশ্ন 28&lt;/em&gt;&lt;/strong&gt;: . You are given the following PHP script, which processes a large array, Rewrite it to reduce memory usage without changing the output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;code&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$data = [];
for ($i = 0; $i &amp;lt; 100000; $i++) {
$data[] = str_repeat('X', 1000);
}
echo array_sum(array_map('strlen', $data));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;নিশ্চয়ই! নিচে দেওয়া কোডটি একটি বড় অ্যারে $data তৈরি করে যেখানে ১ লাখ এলিমেন্ট আছে, প্রতিটিতে ১০০০ বারের &lt;code&gt;'X'&lt;/code&gt; থাকে। এরপর &lt;code&gt;strlen()&lt;/code&gt; দিয়ে প্রতিটি স্ট্রিংয়ের দৈর্ঘ্য বের করে তাদের যোগফল প্রিন্ট করে।&lt;/p&gt;

&lt;p&gt;🔴 &lt;strong&gt;মূল সমস্যা:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$data[] = str_repeat('X', 1000);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এভাবে ১ লাখ বড় স্ট্রিং মেমোরিতে রেখে দেয়, যা প্রচুর &lt;strong&gt;মেমোরি&lt;/strong&gt; খরচ করে।&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;লক্ষ্য&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;একই আউটপুট&lt;/li&gt;
&lt;li&gt;কিন্তু কম memory consumption&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;অপটিমাইজড ভার্সন:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$totalLength = 0;

for ($i = 0; $i &amp;lt; 100000; $i++) {
    $totalLength += strlen(str_repeat('X', 1000));
}

echo $totalLength;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;ব্যাখ্যা&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;আমরা পুরো অ্যারে &lt;code&gt;$data&lt;/code&gt; মেমোরিতে জমাই না।&lt;/li&gt;
&lt;li&gt;সরাসরি প্রতিটি স্ট্রিংয়ের &lt;code&gt;strlen&lt;/code&gt; বের করে &lt;code&gt;totalLength&lt;/code&gt; এ যোগ করি।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;মেমোরিতে 1 লাখ স্ট্রিং না রেখে সরাসরি যোগফল করা হয়&lt;/strong&gt;, ফলে Memory Usage অনেক কমে যায়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔍 &lt;strong&gt;আউটপুট&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100000000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;কারণ &lt;code&gt;100000 * 1000 = 100,000,000&lt;/code&gt; চরিত্র&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;✅ &lt;strong&gt;অতিরিক্ত টিপস:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Laravel বা PHP performance optimization-এর সময় "avoid keeping large arrays in memory" খুব গুরুত্বপূর্ণ বিষয়।&lt;/li&gt;
&lt;li&gt;একই কৌশল আপনি CSV read, log process, বা large dataset গুলোর ক্ষেত্রেও ব্যবহার করতে পারেন — &lt;code&gt;streaming বা on-the-fly processing&lt;/code&gt;।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;&lt;em&gt;প্রশ্ন 29&lt;/em&gt;&lt;/strong&gt;:. Write a raw PHP script to handle form submission with:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;XSS protection for input fields.&lt;/li&gt;
&lt;li&gt;CSRF token generation and validation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;অবশ্যই! নিচে একটি সম্পূর্ণ &lt;strong&gt;Raw PHP স্ক্রিপ্ট&lt;/strong&gt; দেওয়া হলো যা একটি ফর্ম প্রসেস করে এবং তাতে:&lt;/p&gt;

&lt;p&gt;✅ XSS Protection&lt;br&gt;
✅ CSRF Token Generation &amp;amp; Validation&lt;/p&gt;

&lt;p&gt;উভয় সিকিউরিটি ব্যবস্থা অন্তর্ভুক্ত করা হয়েছে।&lt;/p&gt;



&lt;p&gt;✅ &lt;strong&gt;Step-by-Step Raw PHP Script&lt;/strong&gt;&lt;br&gt;
📁 &lt;code&gt;form.php&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php
session_start();

// ✅ CSRF Token Generate
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// ✅ যদি POST সাবমিট হয়
if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    // ✅ 1. CSRF Token Validate
    if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
        die('CSRF token validation failed!');
    }

    // ✅ 2. XSS Protection — input sanitize
    $name = htmlspecialchars(trim($_POST['name'] ?? ''));
    $email = htmlspecialchars(trim($_POST['email'] ?? ''));

    echo "&amp;lt;h3&amp;gt;Form submitted safely!&amp;lt;/h3&amp;gt;";
    echo "Name: " . $name . "&amp;lt;br&amp;gt;";
    echo "Email: " . $email . "&amp;lt;br&amp;gt;";

    // ✅ Optional: regenerate token for next form
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
?&amp;gt;

&amp;lt;!-- ✅ HTML Form --&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Secure Form&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h2&amp;gt;Secure Form&amp;lt;/h2&amp;gt;
    &amp;lt;form method="POST" action="form.php"&amp;gt;
        &amp;lt;label&amp;gt;Name:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;
        &amp;lt;input type="text" name="name" required&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

        &amp;lt;label&amp;gt;Email:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;
        &amp;lt;input type="email" name="email" required&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

        &amp;lt;!-- ✅ CSRF Token --&amp;gt;
        &amp;lt;input type="hidden" name="csrf_token" value="&amp;lt;?php echo $_SESSION['csrf_token']; ?&amp;gt;"&amp;gt;

        &amp;lt;button type="submit"&amp;gt;Submit&amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔐 &lt;strong&gt;Breakdown&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fftn303ecwl0hm7um6ene.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fftn303ecwl0hm7um6ene.png" alt=" " width="800" height="234"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Example Output&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Form submitted safely!
Name: Ruhul Amin
Email: ruhul@example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🛡️ &lt;strong&gt;Extra Security Tips:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;XSS রোধে প্রতিটি আউটপুটেও &lt;code&gt;htmlspecialchars()&lt;/code&gt; ব্যবহার করুন&lt;/li&gt;
&lt;li&gt;CSRF Token প্রতিটি ফর্মে নতুন করে জেনারেট করা ভালো (per request)&lt;/li&gt;
&lt;li&gt;আরও শক্তিশালী validation-এর জন্য &lt;code&gt;filter_var()&lt;/code&gt; ব্যবহার করতে পারেন&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;&lt;em&gt;প্রশ্ন 30&lt;/em&gt;&lt;/strong&gt;: Implement a custom artisan command to archive orders older than 1 year by:&lt;/p&gt;

&lt;p&gt;Moving them to an archive table.Logging the operation details to a custom log file.Handling errors gracefully with retries and notifications.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;অবশ্যই! নিচে &lt;strong&gt;Laravel Custom Artisan Command&lt;/strong&gt; এর মাধ্যমে একটি সম্পূর্ণ সমাধান দেওয়া হলো যেখানে:&lt;/p&gt;

&lt;p&gt;✅ ১ বছরের পুরোনো অর্ডারগুলো &lt;code&gt;orders&lt;/code&gt; টেবিল থেকে &lt;code&gt;archived_orders&lt;/code&gt; টেবিলে &lt;strong&gt;সরিয়ে নেওয়া&lt;/strong&gt; হচ্ছে&lt;br&gt;
✅ অপারেশন ডিটেইলস &lt;strong&gt;custom log file&lt;/strong&gt; এ সংরক্ষণ করা হচ্ছে&lt;br&gt;
✅ &lt;strong&gt;রিট্রাই ও নোটিফিকেশন&lt;/strong&gt; সহ &lt;strong&gt;error handling&lt;/strong&gt; ব্যবস্থাও রাখা হয়েছে&lt;/p&gt;

&lt;p&gt;🛠️ &lt;strong&gt;ধাপ ১: &lt;code&gt;archived_orders&lt;/code&gt; মাইগ্রেশন তৈরি করুন&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan make:migration create_archived_orders_table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📁 &lt;code&gt;database/migrations/xxxx_xx_xx_create_archived_orders_table.php&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function up()
{
    Schema::create('archived_orders', function (Blueprint $table) {
        $table-&amp;gt;id();
        $table-&amp;gt;unsignedBigInteger('user_id');
        $table-&amp;gt;decimal('amount', 10, 2);
        $table-&amp;gt;timestamps();
    });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧑‍💻 &lt;strong&gt;ধাপ ২: কাস্টম কমান্ড তৈরি করুন&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan make:command ArchiveOldOrders
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📁 &lt;code&gt;app/Console/Commands/ArchiveOldOrders.php&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Throwable;

class ArchiveOldOrders extends Command
{
    protected $signature = 'orders:archive-old';
    protected $description = 'Archive orders older than 1 year to archived_orders table';

    public function handle()
    {
        $this-&amp;gt;info('Starting archive process...');
        $attempts = 0;
        $maxAttempts = 3;

        do {
            try {
                DB::beginTransaction();

                $oldOrders = DB::table('orders')
                    -&amp;gt;where('created_at', '&amp;lt;', now()-&amp;gt;subYear())
                    -&amp;gt;get();

                foreach ($oldOrders as $order) {
                    DB::table('archived_orders')-&amp;gt;insert([
                        'id'        =&amp;gt; $order-&amp;gt;id,
                        'user_id'   =&amp;gt; $order-&amp;gt;user_id,
                        'amount'    =&amp;gt; $order-&amp;gt;amount,
                        'created_at'=&amp;gt; $order-&amp;gt;created_at,
                        'updated_at'=&amp;gt; $order-&amp;gt;updated_at,
                    ]);

                    DB::table('orders')-&amp;gt;where('id', $order-&amp;gt;id)-&amp;gt;delete();

                    // ✅ কাস্টম লগ ফাইলে লগ করা
                    Log::channel('archive')-&amp;gt;info("Archived order ID: {$order-&amp;gt;id}");
                }

                DB::commit();
                $this-&amp;gt;info('Archiving complete. Total orders: ' . count($oldOrders));
                return Command::SUCCESS;

            } catch (Throwable $e) {
                DB::rollBack();
                $attempts++;

                Log::channel('archive')-&amp;gt;error("Attempt {$attempts} failed: " . $e-&amp;gt;getMessage());

                if ($attempts &amp;gt;= $maxAttempts) {
                    $this-&amp;gt;error('Archiving failed after 3 attempts.');
                    // ✅ Email or Slack notification if needed
                    // Notification::route('mail', 'admin@example.com')-&amp;gt;notify(new ArchiveFailedNotification($e));
                    return Command::FAILURE;
                }

                $this-&amp;gt;warn("Retrying... (Attempt: {$attempts})");
                sleep(2); // delay between retries
            }
        } while ($attempts &amp;lt; $maxAttempts);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📝 &lt;strong&gt;ধাপ ৩: কাস্টম লগ চ্যানেল তৈরি করুন&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;📁 &lt;code&gt;config/logging.php&lt;/code&gt; এ &lt;code&gt;channels&lt;/code&gt; সেকশনে যুক্ত করুন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'archive' =&amp;gt; [
    'driver' =&amp;gt; 'single',
    'path' =&amp;gt; storage_path('logs/order-archive.log'),
    'level' =&amp;gt; 'info',
],
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🚀 &lt;strong&gt;ধাপ ৪: Artisan Command রান করুন&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan orders:archive-old
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📄 &lt;strong&gt;লগ ফাইল&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;লগ পাবেন এখানে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;storage/logs/order-archive.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;উদাহরণ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[2025-05-26 12:30:00] local.INFO: Archived order ID: 10123
[2025-05-26 12:30:00] local.INFO: Archived order ID: 10124
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔐 &lt;strong&gt;Bonus: নোটিফিকেশন ফেইল হলে&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;// Notification::route('mail', '&lt;a href="mailto:admin@example.com"&gt;admin@example.com&lt;/a&gt;')&lt;br&gt;
//     -&amp;gt;notify(new ArchiveFailedNotification($e));&lt;/p&gt;

&lt;p&gt;চাইলে আমি &lt;code&gt;ArchiveFailedNotification&lt;/code&gt; ক্লাসও তৈরি করে দিতে পারি।&lt;/p&gt;

&lt;p&gt;✅ সংক্ষেপে&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3380bla6iwvwyf8lqyo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3380bla6iwvwyf8lqyo.png" alt=" " width="800" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>laravel</category>
    </item>
    <item>
      <title>React IQ (PHero)</title>
      <dc:creator>Ruhul Amin Sujon</dc:creator>
      <pubDate>Tue, 29 Apr 2025 20:59:51 +0000</pubDate>
      <link>https://dev.to/ruhul_aminsujon_f65b3678/react-iq-phero-47hf</link>
      <guid>https://dev.to/ruhul_aminsujon_f65b3678/react-iq-phero-47hf</guid>
      <description>&lt;p&gt;সাক্ষাৎকার প্রশ্নোত্তর (বাংলা অনুবাদ)&lt;br&gt;
১. সাক্ষাৎকার প্রস্তুতি (Mock Interview Preparation)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন:&lt;/em&gt;&lt;/strong&gt; নিজের সম্পর্কে কিছু বলুন।&lt;br&gt;
&lt;strong&gt;উত্তর&lt;/strong&gt;: আমার নাম রুহুল আমিন সুজন এবং আমার বয়স ২৩ বছর। আমি ছয় মাস আগে সোনারগাঁও বিশ্ববিদ্যালয় থেকে কম্পিউটার সায়েন্স ও ইঞ্জিনিয়ারিং-এ বিএসসি ডিগ্রি অর্জন করেছি। আমার সিজিপিএ ৪.০০ এর মধ্যে ৩.৬। আমি ওয়েব ডেভেলপমেন্টে কাজ করতে ভালোবাসি এবং প্রতিদিন নতুন কিছু শেখার চেষ্টা করি। আমি প্রোগ্রামিং হিরো থেকে সফলভাবে MERN Stack কোর্স সম্পন্ন করেছি। আমি ওয়েব ডেভেলপার হিসেবে আমার কাজকে গুরুত্বের সাথে নেই, যার মানে এই যে, আমি সব সময় নিজেকে আপডেট রাখার চেষ্টা করি এই দ্রুত পরিবর্তনশীল ইন্ডাস্ট্রিতে। আমি সব সময় উদ্যমী এবং নতুন স্কিল শিখতে আগ্রহী।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: আপনার সেরা প্রজেক্ট কোনটি? এর প্রধান ফিচারগুলো কী? এটি করতে গিয়ে আপনি কী কী চ্যালেঞ্জ ফেস করেছেন?&lt;br&gt;
&lt;strong&gt;উত্তর&lt;/strong&gt;: আমার সেরা প্রজেক্ট হচ্ছে 'Parts Bazar'। এই প্রজেক্টে দুটি ড্যাশবোর্ড রয়েছে - একটি ইউজার ড্যাশবোর্ড এবং অপরটি অ্যাডমিন ড্যাশবোর্ড। ইউজাররা পণ্য কিনতে পারে এবং তাদের অর্ডার দেখতে পারে। তারা যেকোনো আন্তর্জাতিক ক্রেডিট কার্ড ব্যবহার করে পেমেন্ট করতে পারে। অ্যাডমিন সব ইউজার দেখতে পারে, নতুন অ্যাডমিন বানাতে পারে, পণ্য যোগ, আপডেট ও ডিলিট করতে পারে এবং সব অর্ডার ও পেমেন্ট স্ট্যাটাস দেখতে পারে। যেসব অর্ডার পেমেন্ট হয়নি, অ্যাডমিন তা ডিলিট করতে পারে। আমি JWT টোকেন নিয়ে সমস্যায় পড়েছিলাম। প্রথমে টোকেন তৈরি করতে পারছিলাম না এবং দুইদিন ধরে সমস্যাটা সমাধান করতে পারিনি। পরে টিউটোরিয়াল দেখি এবং ডকুমেন্টেশন পড়ে আমি সমস্যার সমাধান করি।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: আমরা কেন আপনাকে নিয়োগ দিব?&lt;br&gt;
&lt;strong&gt;উত্তর&lt;/strong&gt;: আমি মনে করি আমার ভালো একাডেমিক ব্যাকগ্রাউন্ড এবং যেসব স্কিল ও অভিজ্ঞতা আপনারা খুঁজছেন তা আমার মধ্যে রয়েছে। যদি আমি সুযোগ পাই, তবে আমি নিজের দক্ষতা তৈরি করার জন্য মনোযোগ দিয়ে কাজ করবো, যা আমার জন্য এবং আপনার প্রতিষ্ঠানের জন্য উপকারী হবে।&lt;br&gt;
প্রশ্ন: আপনার স্যালারি প্রত্যাশা কত?&lt;br&gt;
উত্তর: একজন ফ্রেশার হিসেবে আমার প্রথম অগ্রাধিকার হচ্ছে একটি চাকরি পাওয়া এবং ব্যবহারিকভাবে আমার জ্ঞান ও দক্ষতা উন্নত করা। আমি কোম্পানির নীতিমালা অনুযায়ী বেতন প্রত্যাশা করি এবং এতে আমি একমত।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: আমাদের জন্য আপনার কোনো প্রশ্ন আছে কি?&lt;br&gt;
&lt;strong&gt;উত্তর&lt;/strong&gt;: ১. আপনাদের অফিসে কি চা বা কফি পাওয়া যায়?&lt;br&gt;
২. যদি আমি এই পজিশনের জন্য নির্বাচিত হই, তাহলে প্রথম দুই মাসে আপনি আমার কাছ থেকে কী প্রত্যাশা করবেন?&lt;br&gt;
৩. এখন পর্যন্ত আমার পারফরম্যান্স বিবেচনায়, যদি আমি নির্বাচিত হই তাহলে কোন দিকগুলোতে উন্নতি করা উচিত? আর যদি না হই তাহলে ভবিষ্যতে সফল হওয়ার জন্য আপনি কী পরামর্শ দিবেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: আপনার দুর্বলতা কী?&lt;br&gt;
উত্তর: রাতে দেরি করে ঘুমানো আমার একটি খারাপ অভ্যাস।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;২. HTML&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: HTML4 এবং HTML5 এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
১. &lt;code&gt;&amp;lt;audio&amp;gt;, &amp;lt;video&amp;gt;, &amp;lt;header&amp;gt;, &amp;lt;footer&amp;gt;, &amp;lt;canvas&amp;gt;, &amp;lt;article&amp;gt;&lt;/code&gt; ইত্যাদি ট্যাগ HTML5-এ সাপোর্ট করে, কিন্তু HTML4-এ এসব সাপোর্ট নেই।&lt;br&gt;
২. HTML4-এ মাল্টিমিডিয়া সাপোর্টিং ট্যাগ নেই, কিন্তু HTML5 মাল্টিমিডিয়া কন্টেন্ট সাপোর্ট করে।&lt;br&gt;
৩. HTML4 ক্লায়েন্ট-সাইড ডেটা সংরক্ষণে ক্যাশ ব্যবহার করলেও &lt;code&gt;HTML5 web storage, web SQL, ও application cache&lt;/code&gt; ব্যবহার করে।&lt;br&gt;
৪. HTML5 তে ভুল কোড হ্যান্ডলিং আরও ভালোভাবে করা যায়, HTML4 তে তেমন না।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: HTML-এ semantic ট্যাগ কী? কিছু উদাহরণ দিন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
Semantic ট্যাগ এমন একটি ট্যাগ যা তার অর্থ স্পষ্ট করে, যেমন: &lt;code&gt;&amp;lt;article&amp;gt;, &amp;lt;header&amp;gt;, &amp;lt;footer&amp;gt;, &amp;lt;nav&amp;gt;, &amp;lt;section&amp;gt;&lt;/code&gt;।&lt;br&gt;
অপরদিকে &lt;/p&gt; ও &lt;span&gt; হলো non-semantic, কারণ এগুলো কনটেন্টের মানে প্রকাশ করে না।

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Article, div, section, nav, aside এর উদ্দেশ্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
সবগুলোই semantic ট্যাগ। এর মূল উদ্দেশ্য হলো পেজের কনটেন্টের গঠন বা অর্থ ব্রাউজার এবং ডেভেলপারদের জন্য স্পষ্ট করা।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Meta tag কেন ব্যবহার করবেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
Meta tag HTML ডকুমেন্ট সম্পর্কে অতিরিক্ত তথ্য (metadata) সংরক্ষণ করে।&lt;br&gt;
এটি সার্চ ইঞ্জিন, ব্রাউজার এবং অন্যান্য ওয়েব সার্ভিসের জন্য গুরুত্বপূর্ণ।&lt;br&gt;
যেমন: ক্যারেক্টার সেট, কীওয়ার্ড, লেখক, এবং ভিউপোর্ট সেটিংস নির্ধারণ করা।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: inline, inline-block এবং block উপাদানের মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;inline&lt;/strong&gt;: height/width নির্ধারণ করা যায় না; কনটেন্ট অনুযায়ী সাইজ হয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;inline-block&lt;/strong&gt;: height/width নির্ধারণ করা যায় এবং এটি একটি লাইনে থাকে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;block&lt;/strong&gt;: নতুন লাইনে শুরু হয়, পুরো প্রস্থ জুড়ে স্থান নেয়, height/width নির্ধারণ করা যায়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: strong, b, bold, em, i - এদের মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;b&amp;gt; এবং &amp;lt;i&amp;gt;&lt;/code&gt; স্টাইলিং ট্যাগ – সরাসরি bold ও italic করে।&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;strong&amp;gt; এবং &amp;lt;em&amp;gt;&lt;/code&gt; semantic ট্যাগ – গুরুত্বপূর্ণ বা জোর দিয়ে বোঝাতে ব্যবহৃত হয়, স্টাইল CSS দিয়ে নিয়ন্ত্রণযোগ্য।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: HTML-এ properties এবং attributes এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Attribute: HTML নির্ধারণ করে।&lt;/li&gt;
&lt;li&gt;Property: DOM দ্বারা নির্ধারিত।&lt;/li&gt;
&lt;li&gt;Attribute এর মান স্থির; Property এর মান পরিবর্তনশীল।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Viewport কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
Viewport হচ্ছে ব্রাউজারে দৃশ্যমান ওয়েব পেজের এলাকা, যা ডিভাইস ভেদে ভিন্ন হতে পারে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Audio এবং Video tag কি ব্যবহার করেছেন? কীভাবে কাজ করে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
হ্যাঁ, ব্যবহার করেছি। &lt;code&gt;&amp;lt;audio&amp;gt; ও &amp;lt;video&amp;gt;&lt;/code&gt; ট্যাগের মাধ্যমে মিডিয়া যুক্ত করা যায়। &lt;code&gt;src&lt;/code&gt; অ্যাট্রিবিউটে ফাইল সোর্স দিতে হয়, &lt;code&gt;controls&lt;/code&gt; অ্যাট্রিবিউট ব্যবহার করলে ইউজার প্লে/পজ করতে পারে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Hyperlink কী? কোন ট্যাগ ও অ্যাট্রিবিউট ব্যবহার করবেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
হাইপারলিঙ্ক হলো একটি লিংক যা ক্লিক করলে ব্যবহারকারী অন্য পৃষ্ঠায় যেতে পারে।&lt;br&gt;
ট্যাগ: &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;&lt;br&gt;
অ্যাট্রিবিউট: &lt;code&gt;href&lt;/code&gt; (লিংকের গন্তব্য নির্দেশ করে)।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: HTML elements এবং tags এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tag&lt;/strong&gt;: &lt;code&gt;&amp;lt;p&amp;gt;, &amp;lt;div&amp;gt;&lt;/code&gt; ইত্যাদি, HTML এর গঠন।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Element&lt;/strong&gt;: Tag সহ কনটেন্ট, যেমন &lt;code&gt;&amp;lt;p&amp;gt;Text&amp;lt;/p&amp;gt;&lt;/code&gt;।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: charset কী এবং কেন ব্যবহার করবেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
&lt;code&gt;charset&lt;/code&gt; HTML ডকুমেন্টের ক্যারেক্টার এনকোডিং নির্ধারণ করে। সাধারণত &lt;code&gt;UTF-8&lt;/code&gt; ব্যবহার করা হয়, যা বিশ্বের প্রায় সব ভাষা সাপোর্ট করে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: HTML5-এ image map কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
Image map হলো একটি ছবি যেখানে নির্দিষ্ট কিছু অংশে ক্লিক করে ভিন্ন লিংকে যাওয়া যায়।&lt;br&gt;
ট্যাগ: &lt;code&gt;&amp;lt;map&amp;gt; এবং &amp;lt;area&amp;gt;&lt;/code&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;৩. CSS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Flex layout কী? Flex এবং Grid layout এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
Flex Layout একটি উন্নততর লেআউট মেথড যা এলিমেন্টগুলোকে স্মার্টলি সারি বা কলামে সাজাতে সাহায্য করে।&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flexbox একমাত্রিক (row বা column)।&lt;/li&gt;
&lt;li&gt;Grid হলো দ্বিমাত্রিক (row ও column একসাথে)।&lt;/li&gt;
&lt;li&gt;Grid ব্যবহার করলে আরও জটিল এবং নিখুঁত লেআউট ডিজাইন করা যায়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: CSS position property ব্যাখ্যা করুন। Absolute ও relative position এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
CSS Position property দ্বারা একটি এলিমেন্টকে কোথায় অবস্থান করবে তা নির্ধারণ করা হয়।&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;relative: তার স্বাভাবিক অবস্থান থেকে সরানো হয়।&lt;/li&gt;
&lt;li&gt;absolute: নিকটবর্তী positioned parent এর উপর ভিত্তি করে নির্ধারিত হয়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Box model কী? এর উপাদানগুলো কী কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
Box model HTML এর প্রতিটি এলিমেন্টকে একটি বক্স হিসেবে ধরে। এর উপাদান:&lt;br&gt;
১. Content&lt;br&gt;
২. Padding&lt;br&gt;
৩. Border&lt;br&gt;
৪. Margin&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Hover effect কী? Active class-এর উদ্দেশ্য কী? বা Pseudo-class কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hover Effect&lt;/strong&gt;: ইউজার মাউস নিয়ে গেলে যেকোনো CSS পরিবর্তন যেমন কালার বা সাইজ হওয়া।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Active class&lt;/strong&gt;: যখন ইউজার কোনো এলিমেন্টে ক্লিক করে তখন সেটির স্টাইল পরিবর্তন হয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pseudo-class&lt;/strong&gt;: একটি class যা এলিমেন্টের নির্দিষ্ট স্টেটে স্টাইল নির্ধারণ করে। যেমন: &lt;code&gt;:hover, :active, :focus&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: CSS-এর বিভিন্ন selector কী কী? Class এবং ID selector এর পার্থক্য?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
Selector এর প্রকারভেদ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Element selector&lt;/li&gt;
&lt;li&gt;Class selector &lt;code&gt;(.class-name)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ID selector &lt;code&gt;(#id-name)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Universal selector &lt;code&gt;(*)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Group selector &lt;code&gt;(h1, p)&lt;/code&gt;
&lt;strong&gt;Class vs ID:&lt;/strong&gt;
একটি ক্লাস বহুবার ব্যবহার করা যায়, কিন্তু ID একবারই ব্যবহারযোগ্য।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: CSS Specificity কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
Specificity হলো কোন CSS নিয়ম আগে প্রাধান্য পাবে তা নির্ধারণ করার নিয়ম। বেশি নির্দিষ্ট সিলেক্টর হলে তা কম নির্দিষ্ট সিলেক্টরের উপর প্রাধান্য পায়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: CSS Preprocessor কী? Sass এর সুবিধা কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
CSS Preprocessor একটি টুল যা CSS থেকে আরও উন্নত ফিচার যোগ করে।&lt;br&gt;
&lt;strong&gt;Sass এর সুবিধা:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;কোড পুনঃব্যবহারযোগ্য হয় (variables, mixins)&lt;/li&gt;
&lt;li&gt;CSS লেখার সময় কম লাগে&lt;/li&gt;
&lt;li&gt;Nested rules সহজ করে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Pseudo element কী? একটি উদাহরণ দিন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
Pseudo element ব্যবহার করে একটি এলিমেন্টের নির্দিষ্ট অংশে স্টাইল প্রয়োগ করা যায়।&lt;br&gt;
উদাহরণ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;::first-line&lt;/li&gt;
&lt;li&gt;::before, ::after&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Media query ব্যবহার করে একটি ওয়েবসাইট কিভাবে responsive করবেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
Media query CSS3 এর একটি ফিচার। এটি দিয়ে বিভিন্ন স্ক্রিন সাইজ অনুযায়ী স্টাইল অ্যাডজাস্ট করা যায়। উদাহরণ:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@media (max-width: 600px) {
  body {
    font-size: 14px;
  }
}
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: কিভাবে font size responsive করবেন? CSS এর কোন units ব্যবহার করবেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;vw&lt;/code&gt; (viewport width), &lt;code&gt;em, rem&lt;/code&gt; ব্যবহার করে ফন্ট সাইজ responsive করা যায়।&lt;/li&gt;
&lt;li&gt;Media query দিয়ে ভিন্ন স্ক্রিন সাইজে আলাদা সাইজ সেট করা যায়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Transition এবং Transform এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transform&lt;/strong&gt;: কোনো এলিমেন্টের রূপ পরিবর্তন করে (ঘোরানো, স্কেল করা)।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transition&lt;/strong&gt;: এক অবস্থা থেকে আরেক অবস্থায় ধীরে ধীরে পরিবর্তন ঘটায়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: কিভাবে একটি div-কে আরেকটি div-এর মধ্যে উভয় দিক থেকে কেন্দ্রস্থ করবেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.parent {
  display: flex;
  justify-content: center;
  align-items: center;
}
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;৪. JavaScript (JS)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: JavaScript কীভাবে কাজ করে? Event loop কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
JavaScript একটি single-threaded ভাষা হলেও এটি asynchronous কাজ করতে পারে Event Loop এর মাধ্যমে। ব্রাউজার JavaScript কোড ইন্টারপ্রেট করে এবং চলমান রাখে।&lt;br&gt;
Event Loop ব্রাউজারের task queue থেকে একের পর এক কাজ নিয়ে execute করে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: JavaScript কোড কীভাবে ব্রাউজারে execute হয়?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
JavaScript কোড ব্রাউজারে লোড হওয়ার পর, ব্রাউজারের ইঞ্জিন (যেমন Chrome-এর V8) কোডটি লাইনে লাইনে পড়ে এবং ইনস্ট্যান্টলি execute করে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: “==” এবং “===” এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;==&lt;/code&gt;: কেবলমাত্র &lt;strong&gt;value&lt;/strong&gt; চেক করে।&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;===&lt;/code&gt;: &lt;strong&gt;value এবং type&lt;/strong&gt; দুটোই চেক করে (strict equality)।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Callback function কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
Callback function হলো একটি ফাংশন যা অন্য একটি ফাংশনের আর্গুমেন্ট হিসেবে পাঠানো হয় এবং পরে কল করা হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: কখন function থেকে return করবেন? কিভাবে একাধিক value return করবেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
কোনো function থেকে result চাইলে return ব্যবহার করতে হয়।&lt;br&gt;
JS একাধিক value return করতে পারে না সরাসরি। তাই array বা object আকারে value return করতে হয়।&lt;/p&gt;

&lt;p&gt;প্রশ্ন: bind, call এবং apply এর কাজ কী?&lt;/p&gt;

&lt;p&gt;উত্তর:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;call() ও apply()&lt;/code&gt; সরাসরি ফাংশন এক্সিকিউট করে;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bind()&lt;/code&gt; নতুন ফাংশন রিটার্ন করে যেটি পরে কল করা যায়।&lt;/li&gt;
&lt;li&gt;পার্থক্য: &lt;code&gt;call(arg1, arg2), apply([arg1, arg2]), bind(arg1, arg2)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Closure কীভাবে কাজ করে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
Closure হলো এমন একটি ফাংশন যা তার parent function-এর scope থেকে ভেরিয়েবল access করতে পারে, এমনকি parent ফাংশন execute শেষ হয়ে গেলেও।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: JavaScript এ “this” কী বোঝায়?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Regular function-এ &lt;code&gt;this&lt;/code&gt; হলো global object (যেমন window)।&lt;/li&gt;
&lt;li&gt;Object method-এ &lt;code&gt;this&lt;/code&gt; হলো সেই object।&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;arrow function&lt;/code&gt; এ this &lt;code&gt;parent scope&lt;/code&gt; থেকে আসে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Event bubbling কী? Delegation কীভাবে কাজ করে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
Event bubbling মানে হলো একটি event DOM এর নিচ থেকে উপরের দিকে propagate হয়। Event Delegation মানে হলো parent এলিমেন্টে ইভেন্ট add করা, যাতে child-এর ইভেন্টও handle হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Hoisting কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
Hoisting মানে ভ্যারিয়েবল বা ফাংশন ডিক্লেয়ারেশন উপরের দিকে উঠে যায়। যেমন:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log(a); // undefined
var a = 10;
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Recursive function কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
যে ফাংশন নিজেই নিজেকে কল করে, তাকে recursive function বলে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: undefined ও null এর পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;undefined&lt;/code&gt;: ভ্যারিয়েবল ডিক্লেয়ার করা হয়েছে কিন্তু মান অ্যাসাইন করা হয়নি।&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;null&lt;/code&gt;: ইচ্ছাকৃতভাবে "খালি" ভ্যালু সেট করা।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: JavaScript এর data types কী কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Primitive&lt;/code&gt;: string, number, boolean, null, undefined, symbol, bigint&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Non-primitive&lt;/code&gt;: array, object, function&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: DOM কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
DOM (Document Object Model) হলো একটি API যা HTML ডকুমেন্টকে গঠন করে এবং স্ক্রিপ্ট দিয়ে তা manipulate করা যায়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: JavaScript static type না dynamic type?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
JavaScript হলো dynamically typed language। এক ভ্যারিয়েবল ভিন্ন ভিন্ন টাইপ ধারণ করতে পারে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;৫. ES6&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন:&lt;/em&gt;&lt;/strong&gt; ES6 কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;br&gt;
ES6 (ECMAScript 2015) হলো JavaScript-এর একটি আধুনিক সংস্করণ, যা নতুন সিনট্যাক্স ও ফিচার নিয়ে এসেছে — যেমন:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;arrow function&lt;/li&gt;
&lt;li&gt;template literals&lt;/li&gt;
&lt;li&gt;destructuring&lt;/li&gt;
&lt;li&gt;class&lt;/li&gt;
&lt;li&gt;modules ইত্যাদি
এইসব ফিচার কোডকে আরও পরিষ্কার, সংক্ষিপ্ত এবং রিডেবল করে তোলে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন:&lt;/em&gt;&lt;/strong&gt; var, let এবং const এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzo5z8x3znntpnqxah4hm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzo5z8x3znntpnqxah4hm.png" alt="Image description" width="800" height="237"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Default parameters কেন ব্যবহার করবেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
Function call করার সময় যদি কোনো প্যারামিটার না পাঠানো হয়, তাহলে default মান ব্যবহার করার জন্য default parameter ব্যবহৃত হয়।&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function greet(name = "Guest") {
  console.log("Hello " + name);
}
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Spread operator কীভাবে কাজ করে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
Spread operator &lt;code&gt;(...)&lt;/code&gt; array বা object কে কপি বা merge করতে ব্যবহৃত হয়।&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const nums = [1, 2, 3];  
const newNums = [...nums, 4]; // [1, 2, 3, 4]
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Class এবং Object এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Class হলো object তৈরির ব্লুপ্রিন্ট বা খসড়া।&lt;/li&gt;
&lt;li&gt;Object হলো class-এর instance।&lt;/li&gt;
&lt;li&gt;class তৈরি করলে মেমোরি বরাদ্দ হয় না, কিন্তু object তৈরি করলে হয়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Prototype chain কী? Inheritance কিভাবে কাজ করে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
JavaScript এ প্রতিটি object-এর মধ্যে একটি internal property থাকে যাকে prototype বলে।&lt;br&gt;
Prototype এর মাধ্যমে এক object অন্য object-এর প্রপার্টি ও মেথড অ্যাক্সেস করতে পারে। এটাকেই Prototype Chain বলা হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Call by value এবং Call by reference এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Call by value:&lt;/strong&gt;&lt;br&gt;
প্রিমিটিভ ডেটা টাইপ — ফাংশনে পাঠানোর সময় আসল ভ্যালু কপি হয়ে যায়। পরিবর্তন আসল ভ্যারিয়েবলকে প্রভাবিত করে না।&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Call by reference:&lt;/strong&gt;&lt;br&gt;
অবজেক্ট টাইপ — ফাংশনে পাঠালে মূল ভ্যারিয়েবলের রেফারেন্স পাঠানো হয়। তাই ফাংশনের ভেতরে পরিবর্তন করলে সেটি বাইরেও প্রভাব ফেলে।&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Scope কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
Scope হলো কোন ভ্যারিয়েবল কোথা থেকে অ্যাক্সেস করা যাবে তার সীমা।&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Global Scope&lt;/strong&gt;: ব্লকের বাইরে ঘোষণা করা ভ্যারিয়েবল।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local Scope&lt;/strong&gt;: ব্লকের ভিতরে ঘোষণা করা ভ্যারিয়েবল।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Block Scope&lt;/strong&gt;: &lt;code&gt;let বা const&lt;/code&gt; দিয়ে ব্লকের ভিতরে তৈরি করা ভ্যারিয়েবল।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Higher-order function কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
যে function অন্য function কে argument হিসেবে নেয় বা return করে, তাকে higher-order function বলে।&lt;br&gt;
উদাহরণ: &lt;code&gt;map(), filter(), forEach()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: API কী? GET ও POST এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
API (Application Programming Interface) হলো সফটওয়্যারের মাঝে যোগাযোগের মাধ্যম।&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GET&lt;/strong&gt;: ডেটা রিকোয়েস্ট করে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;POST&lt;/strong&gt;: নতুন ডেটা সাবমিট করে (body-তে)।
GET ইউআরএল-এ ডেটা পাঠায়; POST body-তে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: LocalStorage এবং SessionStorage এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LocalStorage&lt;/strong&gt;: ব্রাউজারে ডেটা চিরস্থায়ীভাবে সংরক্ষণ করে, ম্যানুয়ালি না মুছলে থাকে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SessionStorage&lt;/strong&gt;: শুধু একটি session পর্যন্ত ডেটা রাখে, ট্যাব বন্ধ করলে মুছে যায়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Cookies কী এবং কেন ব্যবহার করবেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
Cookies হলো ছোট টেক্সট ফাইল যা ইউজারের ব্রাউজারে সংরক্ষিত থাকে।&lt;br&gt;
এটি ইউজারকে সনাক্ত করতে এবং ব্রাউজিং অভিজ্ঞতা উন্নত করতে ব্যবহৃত হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: OOP (Object-Oriented Programming) কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
OOP হলো একটি প্রোগ্রামিং পদ্ধতি যেখানে সবকিছু object হিসেবে ব্যবহৃত হয়। এর চারটি মূল ধারণা হলো:&lt;br&gt;
১. Encapsulation&lt;br&gt;
২. Abstraction&lt;br&gt;
৩. Inheritance&lt;br&gt;
৪. Polymorphism&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: Array এবং LinkedList এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Array&lt;/code&gt;: contiguous memory, fixed size, দ্রুত অ্যাক্সেস&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;LinkedList&lt;/code&gt;: non-contiguous memory, dynamic size, insert/delete সহজ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন&lt;/em&gt;&lt;/strong&gt;: JavaScript অ্যাপ্লিকেশন কীভাবে debug করবেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
Error message গুগলে সার্চ করুন। StackOverflow বা documentation পড়ে সমস্যার সমাধান খুঁজে বের করে কোডে প্রয়োগ করুন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;৬. React&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: ReactJS কী? এর সুবিধা ও অসুবিধাগুলো কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;ReactJS হলো একটি জনপ্রিয় ফ্রন্টএন্ড JavaScript লাইব্রেরি যা UI (User Interface) তৈরি করতে ব্যবহৃত হয়। এটি Meta (Facebook) দ্বারা তৈরি ও পরিচালিত।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;সুবিধা&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;শেখা সহজ&lt;/li&gt;
&lt;li&gt;ডাইনামিক ওয়েব অ্যাপ তৈরি সহজ&lt;/li&gt;
&lt;li&gt;Component পুনঃব্যবহারযোগ্য&lt;/li&gt;
&lt;li&gt;Performance উন্নত&lt;/li&gt;
&lt;li&gt;JavaScript লাইব্রেরির সুবিধা&lt;/li&gt;
&lt;li&gt;সহজে টেস্টিং করা যায়&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;অসুবিধা&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;দ্রুত আপডেট হওয়ায় শেখা কঠিন হতে পারে&lt;/li&gt;
&lt;li&gt;ডকুমেন্টেশন দুর্বল&lt;/li&gt;
&lt;li&gt;শুধুমাত্র view নিয়ে কাজ করে&lt;/li&gt;
&lt;li&gt;JSX নতুনদের জন্য জটিল হতে পারে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: আপনি কেন ReactJS ব্যবহার করবেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;ReactJS কোড সহজ, পরিচালনাযোগ্য ও পুনঃব্যবহারযোগ্য। এটি স্কেলেবল এবং দ্রুত অ্যাপ্লিকেশন তৈরিতে সহায়ক। পাশাপাশি অন্যান্য ফ্রেমওয়ার্কের তুলনায় ReactJS বেশি ফ্লেক্সিবল।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: Virtual DOM কী? Virtual এবং Real DOM এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Virtual DOM হলো DOM এর একটি হালকা ভার্সন যা মেমোরিতে থাকে এবং আসল DOM পরিবর্তনের আগে পার্থক্য চিহ্নিত করে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;পার্থক্য&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real DOM সরাসরি UI পরিবর্তন করে, ধীরগতি।&lt;/li&gt;
&lt;li&gt;Virtual DOM পরিবর্তন দ্রুত হয় এবং তারপর আসল DOM-এ প্রয়োগ হয়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: Props ও State এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F99cqllwts2e300r5k869.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F99cqllwts2e300r5k869.png" alt="Image description" width="800" height="182"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: useState কী এবং কেন ব্যবহার করেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;useState হলো React Hook যা ফাংশনাল কম্পোনেন্টে state ব্যবহারের সুবিধা দেয়। এতে component rerender হয় ডেটা চেঞ্জ হলে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: Context API কী? Prop drilling এ এটি কীভাবে সাহায্য করে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Context API অনেকগুলো লেয়ারে ডেটা প্রপস না পাঠিয়ে সরাসরি component-এ পাঠানোর ব্যবস্থা করে। এটি prop drilling এর বিকল্প।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: useEffect ও useState এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;useState&lt;/code&gt;: state পরিচালনা করে&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;useEffect&lt;/code&gt;: side-effect পরিচালনা করে (API call, timer, etc.)
 useEffect এর dependency array দিয়ে নির্ধারণ করা যায় কবে এটি চলবে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: JSX কীভাবে কাজ করে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;JSX মানে JavaScript XML — এটি HTML এর মত দেখতে হলেও JavaScript এর ভিতরেই লেখা হয়। Babel JSX কে JavaScript এ রূপান্তর করে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: React Component Lifecycle ব্যাখ্যা করুন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;React Component Lifecycle এর তিনটি ধাপ:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Mount&lt;/strong&gt;: Component তৈরি ও DOM-এ যোগ হয় (&lt;code&gt;constructor, render, componentDidMount&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update&lt;/strong&gt;: State/Props পরিবর্তন হলে ঘটে (&lt;code&gt;render, componentDidUpdate&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unmount&lt;/strong&gt;: Component DOM থেকে মুছে যায় (&lt;code&gt;componentWillUnmount&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: Custom Hook কী? কিভাবে তৈরি করবেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Custom Hook হলো আপনার নিজের তৈরি React Hook যা সাধারণ লজিক অনেক Component-এ ব্যবহারের সুবিধা দেয়।&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function useCustomHook() {
  const [data, setData] = useState(null);
  return [data, setData];
}
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: আপনি কীভাবে একটি React অ্যাপ অপ্টিমাইজ করবেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Component memoization (React.memo)&lt;/li&gt;
&lt;li&gt;Lazy loading / Code splitting&lt;/li&gt;
&lt;li&gt;useCallback ও useMemo ব্যবহার&lt;/li&gt;
&lt;li&gt;উপযুক্ত key ব্যবহার&lt;/li&gt;
&lt;li&gt;DOM update সীমিত রাখা&lt;/li&gt;
&lt;li&gt;থ্রটল ও ডিবাউন্স ব্যবহার&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: One-way ও Two-way data binding এর মধ্যে পার্থক্য কী? React কী ব্যবহার করে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;React one-way data binding ব্যবহার করে। মানে প্যারেন্ট থেকে চাইল্ডে ডেটা যায়, কিন্তু চাইল্ড পরিবর্তন করলে তা প্যারেন্টে সরাসরি যাবে না।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: useEffect হুক থেকে কিছু return করলে কেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;useEffect থেকে return করা ফাংশনটি Cleanup ফাংশন হিসেবে কাজ করে — Component Unmount হলে বা dependency পরিবর্তনে এটি চলে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;৭. React IQ (ইন্টারভিউ প্রশ্নোত্তর)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: কিভাবে একটি Child Component থেকে Parent Component-এ ডেটা পাঠাবেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;১. প্রথমে parent ও child কম্পোনেন্ট তৈরি করুন।&lt;br&gt;
২. parent কম্পোনেন্টে একটি function তৈরি করুন।&lt;br&gt;
৩. এই function-টি prop হিসেবে child এ পাঠান।&lt;br&gt;
৪. child থেকে button ক্লিক বা event এর মাধ্যমে সেই ফাংশন কল করে parent-এ ডেটা পাঠান।&lt;br&gt;
৫. parent এ useState হুক ব্যবহার করে ডেটা সংরক্ষণ করুন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: ৪টি বা তার বেশি props কীভাবে চাইল্ড কম্পোনেন্টে পাঠানো ভালো?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Context API&lt;/li&gt;
&lt;li&gt;Redux
এই দুটি ব্যবহার করলে অনেক লেয়ার ডেটা না পাঠিয়ে centrally manage করা যায়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: Redux কী এবং এর উদ্দেশ্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Redux হলো একটি JavaScript state management লাইব্রেরি। এটি বড় অ্যাপ্লিকেশনের state (ডেটা) পরিচালনা সহজ করে এবং ডেটা flow নির্ভরযোগ্য রাখে। সাধারণত React এর সাথে ব্যবহার করা হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: React Native কী? এটি সম্পর্কে আপনি কী জানেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;React Native হলো একটি ওপেন সোর্স ফ্রেমওয়ার্ক যা React ব্যবহার করে Android ও iOS অ্যাপ তৈরি করতে ব্যবহৃত হয়। এটি JavaScript ব্যবহার করে native mobile অ্যাপ তৈরি করে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: Higher-order components (HOC) কী? একটি উদাহরণ দিন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;HOC হলো এমন একটি ফাংশন যা একটি কম্পোনেন্ট নেয় এবং একটি নতুন কম্পোনেন্ট রিটার্ন করে।&lt;br&gt;
উদাহরণ: &lt;code&gt;withAuth(Component)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: useEffect হুক থেকে return কেন করা হয়?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;যখন একটি কম্পোনেন্ট unmount হয় তখন clean up করার জন্য useEffect থেকে return ফাংশন করা হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: আপনি কীভাবে একটি React অ্যাপ অপ্টিমাইজ করবেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;১. Immutable ডেটা ব্যবহার&lt;br&gt;
২. Functional Component ব্যবহার&lt;br&gt;
৩. Code Split করে ছোট ছোট chunk তৈরি&lt;br&gt;
৪. Inline function পরিহার&lt;br&gt;
৫. Debounce ও Throttle&lt;br&gt;
৬. Array map-এ index এর পরিবর্তে unique key ব্যবহার&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: React অ্যাপে state ম্যানেজ করার বিভিন্ন উপায় কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;React অ্যাপে state management এর চারটি ধরন আছে:&lt;br&gt;
১. Local state (useState)&lt;br&gt;
২. Global state (Redux, Context API)&lt;br&gt;
৩. Server state (React Query)&lt;br&gt;
৪. URL state (React Router)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: useEffect হুক-এ dependency inject কেন করা হয়?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Dependency array দিয়ে নির্ধারণ করা হয় useEffect কখন চলবে। যদি dependency না দেওয়া হয়, তাহলে প্রতিবার রেন্ডার হলে effect চলবে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: আপনি কিভাবে React অ্যাপে re-render প্রতিরোধ করবেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;React.memo()&lt;/code&gt; ব্যবহার করে ফাংশনাল কম্পোনেন্ট memoize করা যায়&lt;/li&gt;
&lt;li&gt;useMemo, useCallback হুক&lt;/li&gt;
&lt;li&gt;কম্পোনেন্টকে যত সম্ভব ছোট ও নির্দিষ্ট রাখা&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: ReactJS এর কিছু অসুবিধা বলুন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;দ্রুত পরিবর্তনের কারণে নতুনদের জন্য শেখা কঠিন&lt;/li&gt;
&lt;li&gt;ডকুমেন্টেশন দুর্বল&lt;/li&gt;
&lt;li&gt;শুধুমাত্র View লেয়ার নিয়ে কাজ করে&lt;/li&gt;
&lt;li&gt;JSX নতুনদের জন্য বিভ্রান্তিকর হতে পারে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: React কি One-way না Two-way Data Binding করে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;React শুধুমাত্র One-way data binding করে — ডেটা প্যারেন্ট থেকে চাইল্ডে যায়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: useEffect হুক থেকে কিছু return করলে কেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;এই return করা ফাংশন clean-up effect হিসেবে কাজ করে, যা কম্পোনেন্ট unmount হওয়ার সময় চলে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;৮. Node.js ও MongoDB&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: Node.js কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Node.js হলো একটি JavaScript runtime environment যা V8 engine ব্যবহার করে এবং ব্রাউজারের বাইরে JavaScript কোড চালাতে পারে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: Node.js ও JavaScript এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript হলো প্রোগ্রামিং ল্যাঙ্গুয়েজ; Node.js হলো JS এর runtime environment।&lt;/li&gt;
&lt;li&gt;JavaScript সাধারণত client-side এ চলে; Node.js server-side এ চলে।&lt;/li&gt;
&lt;li&gt;Node.js ব্রাউজার ছাড়াও JS কোড চালাতে সক্ষম।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: Node.js কি single-threaded না multi-threaded?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Node.js হলো single-threaded। তবে এটি asynchronous ও non-blocking architecture ব্যবহার করে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: Node.js কি blocking না non-blocking কাজ করে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
Node.js non-blocking ও asynchronous কাজ করে। এটি ইভেন্ট-চালিত (event-driven), তাই একাধিক অনুরোধ একসাথে পরিচালনা করতে পারে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: NPM কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
NPM (Node Package Manager) হলো একটি টুল যেটি Node.js প্যাকেজ install, update, এবং manage করতে ব্যবহৃত হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: ডাটাবেজের উদ্দেশ্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;ডাটাবেজ হলো তথ্য সংরক্ষণের একটি ব্যবস্থা। এর উদ্দেশ্য হলো তথ্যকে সংগঠিতভাবে সংরক্ষণ, ব্যবস্থাপনা ও দ্রুত অ্যাক্সেস নিশ্চিত করা।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: SQL ও NoSQL ডাটাবেজের মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi24y2avarv1o7ofnyeyg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi24y2avarv1o7ofnyeyg.png" alt="Image description" width="800" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: React এর সাথে Node ও MongoDB কেন ব্যবহৃত হয়? MySQL কেন নয়?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;MongoDB একটি NoSQL ডাটাবেজ, এটি document ভিত্তিক এবং ফ্লেক্সিবল। React ও Node JS এর সাথে এটি সহজেই মেলে।&lt;br&gt;
MySQL schema নির্ভর এবং structure কঠিন, তাই MERN Stack এ MongoDB ব্যবহৃত হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: Database design ও Database schema design বলতে কী বোঝায়?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Database Design&lt;/strong&gt;: ডাটাবেজের গঠন ও কাঠামো কেমন হবে তা পরিকল্পনা করা।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schema Design&lt;/strong&gt;: ডাটার গঠন এবং টেবিল বা ডকুমেন্ট কিভাবে সম্পর্কিত হবে তার নির্দেশনা।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: সার্ভার ক্র্যাশ করলে কী করবেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;১. সমস্যার লক্ষণ পর্যবেক্ষণ করুন&lt;br&gt;
২. লোগস ও এরর চেক করুন&lt;br&gt;
৩. Safe Mode-এ বুট করুন&lt;br&gt;
৪. ইভেন্ট ভিউয়ার বা লিনাক্সের লগ ব্যবহার করুন&lt;br&gt;
৫. সার্ভার রিস্টার্ট করুন&lt;br&gt;
৬. ভবিষ্যতে এড়াতে মনিটরিং টুল ব্যবহার করুন&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: API কিভাবে কাজ করে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
API (Application Programming Interface) হলো সফটওয়্যারের মধ্যে যোগাযোগের মাধ্যম। এটি client এর অনুরোধ server এ পৌঁছে দেয় এবং উত্তরের ডেটা আবার client এ পাঠায়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: CRUD কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;CRUD এর পূর্ণরূপ: Create, Read, Update, Delete — এটি ডাটাবেজ পরিচালনার মৌলিক চারটি কাজ।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: GET এবং POST এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GET&lt;/strong&gt;: ইউআরএল এর মাধ্যমে ডেটা পাঠায়, সাধারণত ডেটা পড়ার জন্য।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;POST&lt;/strong&gt;: body এর মাধ্যমে ডেটা পাঠায়, সাধারণত নতুন ডেটা তৈরি বা সাবমিট করার জন্য।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: PUT ও PATCH এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PUT&lt;/strong&gt;: সম্পূর্ণ রেকর্ড আপডেট করে বা নতুন রেকর্ড তৈরি করে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PATCH&lt;/strong&gt;: নির্দিষ্ট অংশ পরিবর্তন করে, সম্পূর্ণ রেকর্ড নয়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: API সিকিউর করার উপায় কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;১. HTTPS ব্যবহার করুন&lt;br&gt;
২. Token ভিত্তিক authentication (যেমন: JWT)&lt;br&gt;
৩. Input validation করুন&lt;br&gt;
৪. API rate limit করুন&lt;br&gt;
৫. তথ্য URL এ না পাঠিয়ে body তে পাঠান&lt;br&gt;
৬. OAuth ব্যবহার করুন&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: Mongoose কী? এটি কিভাবে কাজ করে? আপনি কি এটি ব্যবহার করেছেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Mongoose হলো MongoDB এর জন্য একটি ODM (Object Data Modeling) লাইব্রেরি যা schema validation, relationship এবং query পরিচালনা সহজ করে।&lt;br&gt;
হ্যাঁ, আমি এটি ব্যবহার করেছি।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: Webpack কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;br&gt;
Webpack হলো একটি module bundler, যা একাধিক ফাইল/মডিউলকে একত্র করে একটি বা কিছু ফাইলে পরিণত করে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন&lt;/strong&gt;: REST API কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;REST API হলো Representational State Transfer নীতিমালা অনুযায়ী তৈরি একটি API। এটি HTTP Method (GET, POST, PUT, DELETE) ব্যবহার করে ক্লায়েন্ট ও সার্ভারের মধ্যে ডেটা আদান-প্রদান করে।&lt;/p&gt;

&lt;/span&gt;

</description>
    </item>
    <item>
      <title>Database - Level 1 - Part 1</title>
      <dc:creator>Ruhul Amin Sujon</dc:creator>
      <pubDate>Thu, 24 Apr 2025 16:09:47 +0000</pubDate>
      <link>https://dev.to/ruhul_aminsujon_f65b3678/database-level-1-part-1-3630</link>
      <guid>https://dev.to/ruhul_aminsujon_f65b3678/database-level-1-part-1-3630</guid>
      <description>&lt;p&gt;🔸 &lt;strong&gt;SQL সম্পর্কিত প্রশ্ন ও উত্তরঃ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন ১&lt;/strong&gt;: SQL কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;: &lt;/p&gt;

&lt;p&gt;SQL (Structured Query Language) হলো একটি স্ট্যান্ডার্ড ল্যাঙ্গুয়েজ যা ডেটাবেইসে ডেটা &lt;code&gt;insert, update, delete&lt;/code&gt; এবং query করার জন্য ব্যবহৃত হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ২&lt;/em&gt;&lt;/strong&gt;: SELECT, INSERT, UPDATE ও DELETE এর কাজ কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SELECT&lt;/code&gt; – ডেটাবেইস থেকে ডেটা পড়তে ব্যবহৃত হয়&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;INSERT&lt;/code&gt; – নতুন ডেটা যোগ করতে ব্যবহৃত হয়&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;UPDATE&lt;/code&gt; – বিদ্যমান ডেটা আপডেট করতে ব্যবহৃত হয়&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DELETE&lt;/code&gt; – ডেটা মুছে ফেলতে ব্যবহৃত হয়&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ৩&lt;/em&gt;&lt;/strong&gt;: WHERE এবং HAVING এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;WHERE&lt;/code&gt; ব্যবহার হয় row ফিল্টার করার জন্য এবং এটি &lt;code&gt;GROUP BY এর আগে&lt;/code&gt; ব্যবহৃত হয়।&lt;br&gt;
&lt;code&gt;HAVING&lt;/code&gt; ব্যবহার হয় aggregate result (যেমন COUNT(), SUM()) ফিল্টার করতে এবং এটি &lt;code&gt;GROUP BY এর পরে&lt;/code&gt; ব্যবহৃত হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ৪&lt;/em&gt;&lt;/strong&gt;: GROUP BY কী কাজে লাগে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;: &lt;/p&gt;

&lt;p&gt;GROUP BY ব্যবহৃত হয় &lt;code&gt;এক বা একাধিক কলামের উপর ভিত্তি করে ডেটা গ্রুপ করতে&lt;/code&gt;, সাধারণত aggregate function এর সাথে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন ৫&lt;/strong&gt;: Index কী এবং কেন ব্যবহৃত হয়?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;: &lt;/p&gt;

&lt;p&gt;Index হলো ডেটাবেইসের একটি ডেটা স্ট্রাকচার যা &lt;code&gt;দ্রুত সার্চ ও রিট্রাইভাল&lt;/code&gt; সুবিধা দেয়। এটি &lt;code&gt;query execution দ্রুত&lt;/code&gt; করতে সাহায্য করে।&lt;/p&gt;

&lt;p&gt;🔸 &lt;strong&gt;ডেটাবেইস ডিজাইন ও কনসেপ্ট প্রশ্নঃ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রশ্ন ৬&lt;/strong&gt;: Normalization কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;: &lt;/p&gt;

&lt;p&gt;Normalization হলো একটি প্রক্রিয়া যা ডেটাবেইসকে &lt;code&gt;redundancy (একই ডেটা বারবার রাখা)&lt;/code&gt; কমিয়ে এবং ডেটা integrity বাড়িয়ে অপ্টিমাইজ করে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ৭&lt;/em&gt;&lt;/strong&gt;: 1NF, 2NF, 3NF কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;1NF&lt;/code&gt;: প্রতিটি সেল এ্যাটমিক ভ্যালু রাখে&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;2NF&lt;/code&gt;: 1NF + সম্পূর্ণ primary key নির্ভরশীলতা&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;3NF&lt;/code&gt;: 2NF + ট্রানজিটিভ নির্ভরশীলতা দূর করা&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ৮&lt;/em&gt;&lt;/strong&gt;: Primary Key এবং Unique Key এর পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Primary Key&lt;/strong&gt; – &lt;code&gt;প্রতিটি row কে ইউনিকভাবে&lt;/code&gt; শনাক্ত করে, &lt;code&gt;null থাকতে পারে না&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unique Key&lt;/strong&gt; – &lt;code&gt;ইউনিক মান&lt;/code&gt; রাখতে পারে, তবে &lt;code&gt;একবার null&lt;/code&gt; থাকতে পারে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ৯&lt;/em&gt;&lt;/strong&gt;: Foreign Key কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;একটি টেবিলের কলাম যা &lt;code&gt;অন্য টেবিলের Primary Key কে রেফার করে&lt;/code&gt;, এটাকে Foreign Key বলে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ১০&lt;/em&gt;&lt;/strong&gt;: ACID মানে কী কী এবং এটি কেন ব্যবহার করা হয়? উদাহরণ সহ ব্যাখ্যা করো?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;🔸 ACID কী?&lt;/p&gt;

&lt;p&gt;ACID হলো ডেটাবেইসে &lt;strong&gt;ট্রানজ্যাকশন ব্যবস্থাপনার&lt;/strong&gt; ৪টি মৌলিক বৈশিষ্ট্য যা নিশ্চিত করে যে ডেটাবেইসে &lt;strong&gt;ডেটা নির্ভুল, নির্ভরযোগ্য ও সুরক্ষিত&lt;/strong&gt; থাকবে।&lt;br&gt;
ACID এর পুরো অর্থ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A – Atomicity&lt;/li&gt;
&lt;li&gt;C – Consistency&lt;/li&gt;
&lt;li&gt;I – Isolation&lt;/li&gt;
&lt;li&gt;D – Durability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;1. Atomicity (পরমাণবিকতা)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ব্যাখ্যা&lt;/strong&gt;: একটি ট্রানজ্যাকশন &lt;code&gt;সম্পূর্ণ সফল হতে হবে অথবা একদমই হবে না।&lt;/code&gt; আংশিকভাবে কোন কাজ হবে না।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
ধরো, একজন ব্যবহারকারী তার একাউন্ট থেকে টাকা ট্রান্সফার করছে অন্য একাউন্টে।&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;প্রথমে টাকা কাটবে&lt;/li&gt;
&lt;li&gt;তারপর সেই টাকা অন্য একাউন্টে যোগ হবে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;যদি প্রথম ধাপে টাকা কাটে কিন্তু দ্বিতীয় ধাপে কোনো কারণে যোগ না হয়, তাহলে পুরো ট্রানজ্যাকশন rollback হয়ে যাবে। অর্থাৎ, টাকা কাটা হবে না — এটা &lt;strong&gt;Atomicity&lt;/strong&gt;।&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;2. Consistency (সামঞ্জস্যতা)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ব্যাখ্যা&lt;/strong&gt;: ট্রানজ্যাকশনের পরে ডেটাবেইস অবশ্যই একটি &lt;strong&gt;valid বা consistent state&lt;/strong&gt; এ থাকতে হবে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
ধরো ব্যালেন্স ট্রান্সফার করার নিয়ম হলো – একাউন্টে ন্যূনতম ৫০০ টাকা থাকতে হবে।&lt;br&gt;
যদি ২০০ টাকা থাকা অবস্থায় ১০০ টাকা ট্রান্সফার করার চেষ্টা করে, তাহলে consistency rule ভেঙে যাবে, তাই এমন ট্রানজ্যাকশন সফল হবে না।&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;3. Isolation (পৃথকতা)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ব্যাখ্যা&lt;/strong&gt;: একাধিক ট্রানজ্যাকশন একসাথে চললেও, তারা যেন &lt;code&gt;একে অপরের উপর প্রভাব না ফেলে&lt;/code&gt; এবং প্রতিটির রেজাল্ট যেন &lt;code&gt;আলাদা ভাবেই নির্ভরযোগ্য থাকে।&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
ধরো একই সময় দুইজন ইউজার একাউন্ট ব্যালেন্স আপডেট করছে। Isolation নিশ্চিত করে যেন একটির আপডেট অন্যটির ডেটা corrupt না করে। না হলে &lt;strong&gt;race condition&lt;/strong&gt; বা &lt;strong&gt;dirty read&lt;/strong&gt; হতে পারে।&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;4. Durability (স্থায়িত্ব)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ব্যাখ্যা&lt;/strong&gt;: একবার ট্রানজ্যাকশন সফল হলে তা &lt;strong&gt;স্থায়ীভাবে&lt;/strong&gt; ডেটাবেইসে থেকে যাবে, &lt;code&gt;সার্ভার রিস্টার্ট হলেও মুছে যাবে না।&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
একজন ইউজার পেমেন্ট করে এবং ট্রানজ্যাকশন সফল হয়। এরপর হঠাৎ সার্ভার বন্ধ হয়ে যায়। কিন্তু যখন আবার চালু হয়, তখনও সেই ট্রানজ্যাকশন ডেটাবেইসে পাওয়া যায়। এটাই &lt;strong&gt;Durability&lt;/strong&gt;।&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;ACID ব্যবহার কেন গুরুত্বপূর্ণ?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ডেটা corruption রোধ করে&lt;/li&gt;
&lt;li&gt;ডেটার নির্ভরযোগ্যতা বজায় রাখে&lt;/li&gt;
&lt;li&gt;ব্যাঙ্কিং, e-commerce বা multi-user system এ consistency নিশ্চিত করে&lt;/li&gt;
&lt;li&gt;সার্ভার failure হলেও data safe থাকে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;সংক্ষেপে মনে রাখার টিপস:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkdzvkr67lbmydw7e0cpv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkdzvkr67lbmydw7e0cpv.png" alt=" " width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔸 &lt;strong&gt;SQL JOIN সম্পর্কিত প্রশ্ন ও উত্তরঃ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ১১&lt;/em&gt;&lt;/strong&gt;: SQL JOIN কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;JOIN ব্যবহার করে একাধিক টেবিল থেকে সম্পর্কযুক্ত ডেটা একত্রে আনা হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ১২&lt;/em&gt;&lt;/strong&gt;: INNER JOIN কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;: &lt;/p&gt;

&lt;p&gt;দুই টেবিলের যেসব রেকর্ড ম্যাচ করে কেবল সেগুলোই দেখায়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ১৩&lt;/em&gt;&lt;/strong&gt;: LEFT JOIN এবং RIGHT JOIN এর পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;LEFT JOIN&lt;/code&gt;: বাম টেবিলের সব রেকর্ড এবং ডান টেবিলের ম্যাচ করা রেকর্ড&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RIGHT JOIN&lt;/code&gt;: ডান টেবিলের সব রেকর্ড এবং বাম টেবিলের ম্যাচ করা রেকর্ড&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ১৪&lt;/em&gt;&lt;/strong&gt;: FULL OUTER JOIN কী করে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;দুই টেবিলের সব রেকর্ড দেখায়, যদি না ম্যাচ করে তবে null দেখায়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ১৫&lt;/em&gt;&lt;/strong&gt;: SELF JOIN কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;: &lt;/p&gt;

&lt;p&gt;যখন একটি টেবিলকে নিজের সাথেই JOIN করা হয় তখন তাকে SELF JOIN বলে। সাধারণত হায়ারার্কিকাল ডেটা (যেমন employee-manager) এর জন্য ব্যবহৃত হয়।&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl2j4qm01srh05s1e59vq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl2j4qm01srh05s1e59vq.png" alt=" " width="350" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 16&lt;/em&gt;&lt;/strong&gt;: View এবং Materialized View এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;View&lt;/code&gt; হলো একটি ভার্চুয়াল টেবিল যা একটি SQL query এর উপর ভিত্তি করে তৈরি হয়। এতে মূল ডেটা থাকে না, কেবল query চলে।&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Materialized View&lt;/code&gt; হলো এমন একটি ভিউ যেটি query এর রেজাল্টকে ফিজিক্যালি স্টোর করে রাখে, ফলে দ্রুত অ্যাক্সেস পাওয়া যায়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 17&lt;/em&gt;&lt;/strong&gt;: Stored Procedure ও Function এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Stored Procedure&lt;/code&gt; একাধিক স্টেটমেন্টের সমন্বয়ে তৈরি এবং এটি return না-ও করতে পারে।&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Function&lt;/code&gt; সর্বদা একটি মান return করে এবং সাধারণত SELECT statement এর মধ্যে ব্যবহার হয়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 18&lt;/em&gt;&lt;/strong&gt;: Index কীভাবে কাজ করে? এবং কখন Index ব্যবহার করা উচিত নয়?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Index ডেটা স্ট্রাকচার (যেমন B-Tree) ব্যবহার করে সার্চ অপারেশন দ্রুত করে।&lt;br&gt;
&lt;code&gt;Index ব্যবহার করা উচিত নয়&lt;/code&gt; যদি:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;আপনি খুবই ছোট টেবিল নিয়ে কাজ করছেন&lt;/li&gt;
&lt;li&gt;আপনি প্রচুর insert/update/delete করছেন (কারণ এগুলো index রিফ্রেশ করতে হয়)&lt;/li&gt;
&lt;li&gt;আপনি এমন কলামে index করছেন যেখানে ভ্যালুগুলোর ভ্যারিয়েশন খুব কম (low cardinality)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 19&lt;/em&gt;&lt;/strong&gt;: Query Optimization কীভাবে করবেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;প্রয়োজনহীন &lt;code&gt;SELECT *&lt;/code&gt; বাদ দিয়ে নির্দিষ্ট কলাম বেছে নিন&lt;/li&gt;
&lt;li&gt;Index ব্যবহার করুন&lt;/li&gt;
&lt;li&gt;Subquery এর বদলে JOIN ব্যবহার করুন&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Query Execution Plan (EXPLAIN)&lt;/code&gt; দেখে বুঝুন কোথায় সময় বেশি লাগছে&lt;/li&gt;
&lt;li&gt;Aggregate query গুলোতে GROUP BY সাবধানে ব্যবহার করুন&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 20&lt;/em&gt;&lt;/strong&gt;: Database Sharding ও Replication এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sharding&lt;/strong&gt;: ডেটা কে horizontally বিভিন্ন সার্ভারে ভাগ করে রাখে (বড় ডেটাবেইসে লোড কমাতে)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replication&lt;/strong&gt;: একই ডেটা একাধিক সার্ভারে কপি করে রাখা হয় (failover ও read-performance বাড়াতে)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 21&lt;/em&gt;&lt;/strong&gt;: Deadlock কী এবং এটি কীভাবে হ্যান্ডেল করবেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Deadlock তখন ঘটে &lt;code&gt;যখন দুটি বা ততোধিক ট্রানজ্যাকশন একে অপরের রিসোর্সের জন্য অপেক্ষা করতে থাকে এবং কেউই কাজ শেষ করতে পারে না।&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deadlock হ্যান্ডেল করার উপায়ঃ&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;লক নেবার order ঠিক রাখা&lt;/li&gt;
&lt;li&gt;ছোট transaction রাখা&lt;/li&gt;
&lt;li&gt;Retry mechanism যুক্ত করা&lt;/li&gt;
&lt;li&gt;Timeout ব্যবহার করা&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 22&lt;/em&gt;&lt;/strong&gt;: ORM (যেমন Eloquent) ব্যবহার করলে performance issue হতে পারে কেন?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Eager loading না করলে &lt;code&gt;N+1&lt;/code&gt; problem হয়&lt;/li&gt;
&lt;li&gt;Unnecessary query generate হয় যদি যথাযথভাবে &lt;code&gt;scope বা relationship define না করা হয়&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Raw SQL বা &lt;code&gt;optimized query ব্যবহারে&lt;/code&gt; performance অনেক বেড়ে যেতে পারে ORM এর তুলনায়&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 23&lt;/em&gt;&lt;/strong&gt;: Eager Loading vs Lazy Loading — পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eager Loading&lt;/strong&gt;: একসাথে related ডেটা লোড করে (query optimization friendly)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lazy Loading&lt;/strong&gt;: যখন প্রয়োজন হয় তখন related ডেটা লোড করে (ধীরে কাজ করে, N+1 problem হতে পারে)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 24&lt;/em&gt;&lt;/strong&gt;: Transaction isolation level গুলো কী কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Read Uncommitted:&lt;/code&gt; অন্য ট্রানজ্যাকশন থেকে uncommitted ডেটা পড়া যায় (Dirty Read)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Read Committed&lt;/code&gt;: কেবল committed ডেটা পড়ে&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Repeatable Read&lt;/code&gt;: একই query বারবার করলে একই রেজাল্ট পাবেন&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Serializable&lt;/code&gt;: সর্বোচ্চ নিরাপত্তা, ট্রানজ্যাকশন একে অপরের মতো behave করে যেন সিঙ্গেল থ্রেডে হচ্ছে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 25&lt;/em&gt;&lt;/strong&gt;: “EXPLAIN” কমান্ড কী এবং এটি কেন ব্যবহার করা হয়?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;EXPLAIN কমান্ড দিয়ে SQL query এর &lt;code&gt;execution plan দেখা যায়&lt;/code&gt;। এটি দেখায় কোন টেবিল কখন স্ক্যান হচ্ছে, কোন index ব্যবহার হচ্ছে ইত্যাদি — performance tuning এর জন্য এটি খুব গুরুত্বপূর্ণ।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 26&lt;/em&gt;&lt;/strong&gt;: SQL এর ক্যাটাগরিগুলো ও তাদের কাজ?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;i. DDL (Data Definition Language)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;উদ্দেশ্য&lt;/strong&gt;: ডেটাবেইসের স্ট্রাকচার বা স্কিমা তৈরি ও পরিবর্তন করা।&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3sghylu5uutlf82ljv89.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3sghylu5uutlf82ljv89.png" alt=" " width="751" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ii. DML (Data Manipulation Language)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;উদ্দেশ্য&lt;/strong&gt;: ডেটা ইনসার্ট, আপডেট বা ডিলিট করা।&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjm2b11zmhn4v69gftt03.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjm2b11zmhn4v69gftt03.png" alt=" " width="800" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzah4ox3hf4gkmf1mq3vh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzah4ox3hf4gkmf1mq3vh.png" alt=" " width="782" height="574"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl1yas8d5jdqhvdmiq1vg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl1yas8d5jdqhvdmiq1vg.png" alt=" " width="759" height="649"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvp6bj1h09v6owi9jkqcy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvp6bj1h09v6owi9jkqcy.png" alt=" " width="800" height="626"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>JS IQ - Level 1 - Part 2 (Pondit)</title>
      <dc:creator>Ruhul Amin Sujon</dc:creator>
      <pubDate>Thu, 24 Apr 2025 15:06:39 +0000</pubDate>
      <link>https://dev.to/ruhul_aminsujon_f65b3678/js-iq-level-1-part-2-13k1</link>
      <guid>https://dev.to/ruhul_aminsujon_f65b3678/js-iq-level-1-part-2-13k1</guid>
      <description>&lt;p&gt;&lt;strong&gt;Javascript&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Closure&lt;/li&gt;
&lt;li&gt;Prototype&lt;/li&gt;
&lt;li&gt;Event loop&lt;/li&gt;
&lt;li&gt;&lt;p&gt;async await&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Execution context&lt;/strong&gt;: :(&lt;code&gt;js code run krlei EC create hobe&lt;/code&gt;):  two parts.&lt;br&gt;
a. &lt;strong&gt;Memory component ( Variable Environment)&lt;/strong&gt;: stored variables and functions as key value pairs&lt;br&gt;
b. &lt;strong&gt;Code component ( Thread of execution )&lt;/strong&gt;: code &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;2. Execution context phases&lt;/strong&gt;: Running Javascript code creates an execution context. Execution context is created in two phases.&lt;br&gt;
      a. &lt;strong&gt;Creation phase&lt;/strong&gt; ( Memory creation phase )&lt;br&gt;
      b. &lt;strong&gt;Execution phase&lt;/strong&gt; ( Code execution phase )&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Call Stack&lt;/strong&gt;: To manage Global and Local execution contexts, javascript uses a stack which is called Call-Stack (execution context stack, program stack, control stack, run time stack, machine stack).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Hoisting:&lt;/strong&gt;&lt;br&gt;
    a.  Arrow function behaves like a variable&lt;br&gt;
    b.  In creation phase variables are assigned &lt;strong&gt;undefined&lt;/strong&gt;&lt;br&gt;
    c.  function name stores the whole function body as value&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Not Defined&lt;/code&gt; means the variable is not defined, and &lt;code&gt;undefined&lt;/code&gt; means the variable is not assigned value.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Javascript is a loosely types or weakly typed language.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;7. Scope:&lt;/strong&gt; it means where we can access a specific variable or function in our code. Scope is directly dependent on the Lexical Environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Lexical Environment:&lt;/strong&gt; Lexical environment is the local memory of execution context along with the lexical environment of it’s parent. (lexical means ‘in hierarchy’ or ‘in sequence’)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function a() {

            var b = 10;

            c();

            function c() {

            }

}

a()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we can say, c function is lexically sitting in a function. or c is hierarchically inside in a.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. Scope chain:&lt;/strong&gt; The way javascript searches for variables from it’s local memory to the lexical environment of it’s parent, is called scope chain. Or the chain of  lexical environments is called scope chain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. Temporal Dead Zone:&lt;/strong&gt; Temporal dead zone is the time since when the let variable is hoisted and till it is initialized some value. At the time of temporal dead zone, if we try to access a variable, it will give us a reference error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;11. Block:&lt;/strong&gt; Block is defined by { } these curly braces. It is also known as Compound statement. In block let and const variables are stored in block scope, but var variables are stored in global scope. So we say, let &amp;amp; const are in block scoped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;12. Shadowing:&lt;/strong&gt; Variable shadowing refers to the practice of naming two variables – for example, a global and local variable or a local variable and a callback function parameter – with the same name and within scopes that overlap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;13. Closure:&lt;/strong&gt; Function along with its lexical environment forms a closure. When a function is returned from a function, the returned function still keeps it’s lexical scope.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;14. Differences:&lt;/strong&gt; Function statement, function expression, function declaration, anonymous function, Named function expression, parameters vs arguments, first class function, arrow function&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Call stack is in JS engine and JS enfine is the browser. The browser is powerdun. It has the following features:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;a. Timer&lt;br&gt;
b. Geo location&lt;br&gt;
c. Url&lt;br&gt;
d. Console&lt;br&gt;
e. Local storage etc.&lt;/p&gt;

&lt;p&gt;To access these, Browsers provide some web apis. Those are:&lt;/p&gt;

&lt;p&gt;a.  SetTimeout()&lt;br&gt;
b.  Dom apis (document.*)&lt;br&gt;
c.  Fetch()&lt;br&gt;
d.  localStorage&lt;br&gt;
e.  console&lt;br&gt;
f.  location&lt;/p&gt;

&lt;p&gt;we can get these web apis in the Call Stack because of the Global object. Global object is Window in the browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;16. Callback Queue or Task Queue&lt;/strong&gt;: The callback function of the setTimeout is registered in a browser. When the timer of the browser understands that the time is expored, the callback function is passed to the callback queue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;17. Event Loop&lt;/strong&gt;: It is ultimately a checker, just checks the callback queue whether there is anything to execute. Then if the call stack is empty, it passed that item wrapping with an execution context to be executed on call stack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;18. Microtask queue&lt;/strong&gt;: It is similar to callback queue. But it has a higher priority than the callback queue. Callback functions of fetch api are passed to the microtask queue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;19. Microtasks&lt;/strong&gt;: All the callback functions returned from promises are microtasks. They are passed to the mocrotask queue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;20. Starvation of callback functions&lt;/strong&gt;: If a callback function from microtask queue creates another microtask and that creates another microtask and that goes on, the callback function of the callback queue is never executed. This scenario is called starvation of callback function in the callback queue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short Syllabus&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;1.    Data Structure:&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;a.  Linked list&lt;br&gt;
b.  Double linked list&lt;br&gt;
c.  Binary search tree&lt;br&gt;
d.  Stack&lt;br&gt;
e.  Queue&lt;/p&gt;

&lt;p&gt;&lt;code&gt;2.    Algorithm:&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;a.  Time complexity&lt;br&gt;
b.  Space complexity&lt;br&gt;
c.  Selection sort (Time complexity &amp;amp; space complexity)&lt;br&gt;
d.  Insertion sort (Time complexity &amp;amp; space complexity)&lt;br&gt;
e.  Bubble sort (Time complexity &amp;amp; space complexity)&lt;br&gt;
f.  Merge sort (Time complexity &amp;amp; space complexity)&lt;br&gt;
g.  Quick sort (Time complexity &amp;amp; space complexity)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;3.    Database&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;a.  Er diagram&lt;br&gt;
b.  Various keys(foreign key,primary,unique,candidate,composite key)&lt;br&gt;
c.  Relation:&lt;br&gt;
i.  One to one&lt;br&gt;
ii. One to many&lt;br&gt;
iii.    Many to one&lt;br&gt;
iv. Many to many&lt;br&gt;
d.  Join:&lt;br&gt;
i.  Left inner join&lt;br&gt;
ii. Right inner join&lt;br&gt;
iii.    Cross join&lt;br&gt;
iv. Outer join&lt;/p&gt;

&lt;p&gt;e.  Transaction&lt;br&gt;
f.  Trigger&lt;br&gt;
g.  Function&lt;br&gt;
h.  Indexing&lt;/p&gt;

&lt;p&gt;&lt;code&gt;4.    OOP&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;a.  Encapsulation&lt;br&gt;
b.  Inheritance &lt;br&gt;
c.  polymorphism&lt;br&gt;
d.  Compile time polymorphism vs run time polymorphism&lt;br&gt;
e.  abstraction&lt;br&gt;
f.  Abstract class&lt;br&gt;
g.  Access modifier&lt;br&gt;
h.  Multiple inheritance vs multilevel inheritance&lt;br&gt;
i.  Interface&lt;br&gt;
j.  Overloading vs overriding&lt;/p&gt;

&lt;p&gt;&lt;code&gt;5.    Networking&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;a.  Network  7 layer&lt;br&gt;
b.  Tcp vs udp&lt;br&gt;
c.  Application of tcp vs udp&lt;/p&gt;

</description>
    </item>
    <item>
      <title>JS IQ - Level 1 - Part 1</title>
      <dc:creator>Ruhul Amin Sujon</dc:creator>
      <pubDate>Thu, 24 Apr 2025 14:49:08 +0000</pubDate>
      <link>https://dev.to/ruhul_aminsujon_f65b3678/js-iq-level-1-part-1-2idn</link>
      <guid>https://dev.to/ruhul_aminsujon_f65b3678/js-iq-level-1-part-1-2idn</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ১.&lt;/em&gt;&lt;/strong&gt; JavaScript কী এবং এটি কীভাবে কাজ করে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;JavaScript হলো একটি ডাইনামিক, হালকা এবং ইভেন্ট-ড্রিভেন প্রোগ্রামিং ভাষা, যা ওয়েব পেজে ইন্টার‍্যাক্টিভ ফিচার যুক্ত করতে ব্যবহৃত হয়। এটি ব্রাউজারে রান করার জন্য &lt;code&gt;JavaScript Engine&lt;/code&gt; ব্যবহার করে। উদাহরণস্বরূপ, Chrome-এ &lt;code&gt;V8 Engine&lt;/code&gt; এবং Firefox-এ &lt;code&gt;SpiderMonkey&lt;/code&gt;।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ২&lt;/em&gt;&lt;/strong&gt;. JavaScript-এর ভেরিয়েবল ডিক্লারেশনের জন্য var, let এবং const এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftz6sd2nnmcq851gowqlp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftz6sd2nnmcq851gowqlp.png" alt="Image description" width="800" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ৩&lt;/em&gt;&lt;/strong&gt;. Arrow Function এবং Regular Function-এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;i. Arrow Function:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;this কনটেক্সট প্যারেন্ট অবজেক্টের সাথে বাঁধা।&lt;/li&gt;
&lt;li&gt;সংক্ষিপ্ত সিনট্যাক্স।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ii. Regular Function:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;this কনটেক্সট নিজের অবজেক্টের সাথে বাঁধা।&lt;/li&gt;
&lt;li&gt;আরও বিস্তারিত কোড লিখতে হয়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Regular Function
function add(a, b) {
  return a + b;
}

// Arrow Function
const add = (a, b) =&amp;gt; a + b;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ৪&lt;/em&gt;&lt;/strong&gt;. JavaScript-এর == এবং === এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;==&lt;/code&gt; (&lt;strong&gt;Loose Equality&lt;/strong&gt;): ডাটা টাইপ ইগনোর করে শুধু ভ্যালু চেক করে।&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;===&lt;/code&gt; (&lt;strong&gt;Strict Equality&lt;/strong&gt;): ভ্যালু এবং টাইপ দুটোই চেক করে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log(5 == '5');  // true  
console.log(5 === '5'); // false
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ৫&lt;/em&gt;&lt;/strong&gt;. JavaScript-এ Closures কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Closure হলো একটি ফাংশন, যা তার আশেপাশের স্কোপ থেকে ভ্যারিয়েবলের অ্যাক্সেস রাখে, এমনকি সেই স্কোপ শেষ হলেও।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function outerFunction() {
  let count = 0;
  return function innerFunction() {
    count++;
    return count;
  };
}

const counter = outerFunction();
console.log(counter()); // 1
console.log(counter()); // 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ৬&lt;/em&gt;&lt;/strong&gt;. JavaScript-এ Event Loop কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Event Loop হলো একটি মেকানিজম, যা কলব্যাক কিউতে থাকা কাজগুলো একটার পর একটা প্রক্রিয়া করে। এটি JavaScript-এর &lt;code&gt;single-threaded asynchronous nature&lt;/code&gt; ম্যানেজ করে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ধাপ&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Call Stack&lt;/li&gt;
&lt;li&gt;Web APIs&lt;/li&gt;
&lt;li&gt;Callback Queue&lt;/li&gt;
&lt;li&gt;Event Loop&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log('Start');
setTimeout(() =&amp;gt; console.log('Middle'), 1000);
console.log('End');

// Output: Start -&amp;gt; End -&amp;gt; Middle
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ৭&lt;/em&gt;&lt;/strong&gt;. JavaScript-এ async এবং await কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;async&lt;/code&gt;: একটি ফাংশনকে asynchronous বানায়।&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;await&lt;/code&gt;: একটি প্রমিস রেজল্ভ না হওয়া পর্যন্ত অপেক্ষা করে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async function fetchData() {
  const response = await fetch('https://api.example.com/data');
  const data = await response.json();
  console.log(data);
}
fetchData();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;প্রশ্ন ৮&lt;/em&gt;. JavaScript-এ Hoisting কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Hoisting হলো একটি প্রক্রিয়া, যেখানে ভ্যারিয়েবল এবং ফাংশন ডিক্লারেশনগুলো স্কোপের শীর্ষে নিয়ে যাওয়া হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log(a); // undefined
var a = 10;

console.log(b); // ReferenceError
let b = 20;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ৯&lt;/em&gt;&lt;/strong&gt;. JavaScript-এ call(), apply(), এবং bind() এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;call()&lt;/code&gt;: ফাংশনকে ইনভোক করে এবং আর্গুমেন্ট আলাদাভাবে পাস করে।&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;apply()&lt;/code&gt;: ফাংশনকে ইনভোক করে এবং আর্গুমেন্ট একটি অ্যারে হিসেবে পাস করে।&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bind()&lt;/code&gt;: নতুন ফাংশন তৈরি করে এবং আর্গুমেন্ট পরে পাস করা যায়।&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const obj = { name: 'Ruhul' };

function greet(greeting) {
  console.log(`${greeting}, ${this.name}`);
}

greet.call(obj, 'Hello');  // Hello, Ruhul
greet.apply(obj, ['Hi']);  // Hi, Ruhul
const boundGreet = greet.bind(obj);
boundGreet('Hey');         // Hey, Ruhul
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ১০&lt;/em&gt;&lt;/strong&gt;. Promises কী এবং এটি কীভাবে কাজ করে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Promise হলো একটি JavaScript অবজেক্ট, যা অ্যাসিনক্রোনাস অপারেশনের সফলতা বা ব্যর্থতার রেজাল্ট রিপ্রেজেন্ট করে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const promise = new Promise((resolve, reject) =&amp;gt; {
  let success = true;
  if (success) {
    resolve('Operation Successful');
  } else {
    reject('Operation Failed');
  }
});

promise
  .then((result) =&amp;gt; console.log(result))  // Operation Successful
  .catch((error) =&amp;gt; console.log(error));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;প্রশ্ন ১১&lt;/em&gt;. JavaScript-এ this কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;this হলো একটি কিওয়ার্ড, যা &lt;code&gt;বর্তমান অবজেক্টকে রেফার করে&lt;/code&gt;। এটি কনটেক্সটের উপর নির্ভর করে পরিবর্তিত হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const obj = {
  name: 'Ruhul',
  greet() {
    console.log(`Hello, ${this.name}`);
  }
};

obj.greet(); // Hello, Ruhul
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন ১২&lt;/em&gt;&lt;/strong&gt;. JavaScript-এ Debouncing এবং Throttling-এর মধ্যে পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;উত্তর:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Debouncing&lt;/strong&gt;: একটি ফাংশন নির্দিষ্ট সময়ের পরে ট্রিগার হয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Throttling&lt;/strong&gt;: একটি ফাংশন একটি নির্দিষ্ট সময়ের ব্যবধানে বারবার ট্রিগার হয়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Debouncing&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function debounce(func, delay) {
  let timer;
  return function(...args) {
    clearTimeout(timer);
    timer = setTimeout(() =&amp;gt; func(...args), delay);
  };
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Throttling:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function throttle(func, limit) {
  let inThrottle;
  return function(...args) {
    if (!inThrottle) {
      func(...args);
      inThrottle = true;
      setTimeout(() =&amp;gt; (inThrottle = false), limit);
    }
  };
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 13&lt;/em&gt;&lt;/strong&gt;. JavaScript-এ Prototype কী এবং এটি কীভাবে কাজ করে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Prototype হলো JavaScript-এর একটি মেকানিজম, যা অবজেক্টের মধ্যে প্রপার্টি এবং মেথড শেয়ার করার সুযোগ দেয়। প্রতিটি অবজেক্টের একটি prototype থাকে এবং এটি তার প্যারেন্ট অবজেক্টের প্রপার্টি এবং মেথড অ্যাক্সেস করতে পারে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function Person(name) {
  this.name = name;
}

Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}`);
};

const ruhul = new Person('Ruhul');
ruhul.sayHello(); // Hello, my name is Ruhul
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 14&lt;/em&gt;&lt;/strong&gt;. JavaScript-এ Event Delegation কী?&lt;/p&gt;

&lt;p&gt;উত্তর:&lt;/p&gt;

&lt;p&gt;Event Delegation হলো একটি টেকনিক, যেখানে কোনো প্যারেন্ট এলিমেন্টের মাধ্যমে এর চাইল্ড এলিমেন্টের ইভেন্ট হ্যান্ডল করা হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;কেন প্রয়োজন:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;কম মেমরি ব্যবহার।&lt;/li&gt;
&lt;li&gt;নতুন চাইল্ড এলিমেন্ট যোগ করলেও ইভেন্ট কাজ করবে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;document.getElementById('parent').addEventListener('click', function(event) {
  if (event.target &amp;amp;&amp;amp; event.target.tagName === 'BUTTON') {
    console.log(`Button ${event.target.innerText} clicked`);
  }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 15&lt;/em&gt;&lt;/strong&gt;. JavaScript-এ WeakMap এবং WeakSet কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WeakMap&lt;/strong&gt;: শুধুমাত্র অবজেক্টকে কী হিসেবে ধরে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WeakSet&lt;/strong&gt;: শুধুমাত্র অবজেক্টকে ভ্যালু হিসেবে সংরক্ষণ করে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;প্রধান বৈশিষ্ট্য:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;গার্বেজ কালেক্টর অব্যবহৃত অবজেক্ট সরিয়ে দেয়।&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;size, keys(), values()&lt;/code&gt; প্রভৃতি নেই।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let weakMap = new WeakMap();
let obj = {};
weakMap.set(obj, 'value');

let weakSet = new WeakSet();
weakSet.add(obj);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;প্রশ্ন 16&lt;/strong&gt;. Currying কী এবং এটি কেন ব্যবহার করা হয়?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Currying হলো একটি ফাংশনকে একাধিক আর্গুমেন্টের পরিবর্তে এক এক করে আর্গুমেন্ট পাস করার মতো ফাংশনে রূপান্তর করা।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;কেন ব্যবহার করা হয়:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;কোড পুনর্ব্যবহারযোগ্য।&lt;/li&gt;
&lt;li&gt;ডেটা প্রক্রিয়াকরণ সহজ হয়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function curry(f) {
  return function(a) {
    return function(b) {
      return f(a, b);
    };
  };
}

function sum(a, b) {
  return a + b;
}

const curriedSum = curry(sum);
console.log(curriedSum(2)(3)); // 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 17&lt;/em&gt;&lt;/strong&gt;. JavaScript-এ Memoization কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Memoization হলো একটি অপ্টিমাইজেশন টেকনিক, যা আগের ফলাফল ক্যাশ করে রাখে এবং একই ইনপুট পেলে তা সরাসরি ফেরত দেয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function memoize(fn) {
  const cache = {};
  return function(...args) {
    const key = JSON.stringify(args);
    if (cache[key]) return cache[key];
    const result = fn(...args);
    cache[key] = result;
    return result;
  };
}

function slowFunction(num) {
  console.log('Calculating...');
  return num * 2;
}

const fastFunction = memoize(slowFunction);
console.log(fastFunction(5)); // Calculating... 10
console.log(fastFunction(5)); // 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 18&lt;/em&gt;&lt;/strong&gt;. JavaScript-এ Generators এবং Iterators কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Generators&lt;/code&gt;: ফাংশন, যা function* সিনট্যাক্স ব্যবহার করে এবং yield কিওয়ার্ড দিয়ে একাধিক মান প্রদান করতে পারে।&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Iterators&lt;/code&gt;: অবজেক্ট, যা next() মেথড ব্যবহার করে পরবর্তী মান প্রদান করে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function* generatorFunction() {
  yield 1;
  yield 2;
  yield 3;
}

const iterator = generatorFunction();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 19&lt;/em&gt;&lt;/strong&gt;. JavaScript-এ Object.create() কীভাবে কাজ করে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Object.create()&lt;/code&gt; একটি নতুন অবজেক্ট তৈরি করে, যা নির্দিষ্ট প্রোটোটাইপ অবজেক্টের সাথে সংযুক্ত।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const parent = { greet: function() { console.log('Hello'); } };
const child = Object.create(parent);
child.greet(); // Hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 20&lt;/em&gt;&lt;/strong&gt;. JavaScript-এ Debouncing এবং Throttling-এর পার্থক্য কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcp2a3j7jyfg6z9a97mjj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcp2a3j7jyfg6z9a97mjj.png" alt="Image description" width="800" height="132"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Debounce
function debounce(func, delay) {
  let timer;
  return function(...args) {
    clearTimeout(timer);
    timer = setTimeout(() =&amp;gt; func(...args), delay);
  };
}

// Throttle
function throttle(func, limit) {
  let inThrottle;
  return function(...args) {
    if (!inThrottle) {
      func(...args);
      inThrottle = true;
      setTimeout(() =&amp;gt; inThrottle = false, limit);
    }
  };
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;প্রশ্ন 21&lt;/em&gt;&lt;/strong&gt;. JavaScript-এ Promise.all এবং Promise.race কী?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Promise.all&lt;/code&gt;: সব প্রমিস সফল হলে একটি একক প্রমিস রেজল্ভ হয়।&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Promise.race&lt;/code&gt;: প্রথম সফল বা ব্যর্থ হওয়া প্রমিসের রেজাল্ট রিটার্ন করে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const p1 = new Promise((resolve) =&amp;gt; setTimeout(resolve, 100, 'One'));
const p2 = new Promise((resolve) =&amp;gt; setTimeout(resolve, 200, 'Two'));

Promise.all([p1, p2]).then(console.log); // ['One', 'Two']
Promise.race([p1, p2]).then(console.log); // 'One'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
  </channel>
</rss>
