سی ام اس نویسسی ام اس نویسیاد بگیر، سیستم خودتو بنویس
مجلهتماس با ما
سی ام اس نویسسی ام اس نویس

CMS نویس مرجعی برای آموزش برنامه نویسی وب و PHP، توسعه افزونه‌های اختصاصی وردپرس، طراحی ورک‌فلو و اتوماسیون با n8n و توسعه CMS های اختصاصی است. هدف ما ارائه آموزش‌های کاربردی و راهکارهای حرفه‌ای برای توسعه‌دهندگان، کسب‌وکارها و علاقه‌مندان به دنیای برنامه‌نویسی است.

پیوندهای سریع
محصولات فیزیکیمحصولات دیجیتالدوره‌های آموزشی
سی ام اس نویس
مجله سی ام اس نویستماس با ماپنل کاربری
سی ام اس نویس — تمامی حقوق برای سی ام اس نویس محفوظ است. © 1406 تماس با ما09307711941
Session در Laravel چیست؟ آموزش کامل Session و مدیریت داده‌های موقت در لاراول

Session در Laravel چیست؟ آموزش کامل Session و مدیریت داده‌های موقت در لاراول

ممدیر کل سیستم ۱۰ مهر ۱۴۰۵ ۲۲ دقیقه مطالعه ۱ بازدید
Session در Laravel چیست؟ آموزش کامل Session و مدیریت داده‌های موقت در لاراول

در برنامه‌های وب، اطلاعاتی مثل وضعیت ورود کاربر، پیام‌های موقت، اطلاعات سبد خرید، داده‌های فرم و برخی تنظیمات موقتی باید بین چند درخواست مختلف کاربر حفظ شوند. اینجا مفهومی به نام Session یا نشست وارد عمل می‌شود.

پروتکل HTTP به‌صورت ذاتی Stateless است؛ یعنی هر درخواست HTTP مستقل از درخواست قبلی در نظر گرفته می‌شود. بنابراین اگر کاربر در یک درخواست اطلاعاتی را ارسال کند، سرور به‌صورت خودکار تضمین نمی‌کند که در درخواست بعدی همان اطلاعات را در اختیار داشته باشد.

Laravel برای حل این مسئله یک سیستم Session کامل در اختیار توسعه‌دهنده قرار می‌دهد.

در این مقاله یاد می‌گیریم:

  • Session چیست و چرا به آن نیاز داریم؟
  • Session در Laravel چگونه کار می‌کند؟
  • چگونه اطلاعاتی را داخل Session ذخیره کنیم؟
  • چگونه اطلاعات Session را بخوانیم؟
  • چگونه اطلاعات Session را حذف کنیم؟
  • Flash Data چیست؟
  • Session Driver چیست؟
  • چگونه Session را روی File، Database یا Redis ذخیره کنیم؟
  • Session چه ارتباطی با Middleware دارد؟
  • چگونه از Session در Controller، Blade و Middleware استفاده کنیم؟
  • Session چه نقشی در Authentication دارد؟
  • چه نکات امنیتی را هنگام استفاده از Session باید رعایت کنیم؟

Session چیست؟

Session مکانیزمی برای نگهداری اطلاعات مربوط به یک کاربر در چند درخواست مختلف است.

برای مثال فرض کنید کاربر وارد سایت شده و Laravel در اولین درخواست متوجه شده است که این کاربر احراز هویت شده است.

در درخواست بعدی، سرور باید بتواند تشخیص دهد که همان کاربر قبلاً وارد حساب خود شده است.

Session می‌تواند در چنین شرایطی اطلاعات مورد نیاز را بین درخواست‌ها نگهداری کند.

یک مثال ساده دیگر:

فرض کنید کاربر محصولی را به سبد خرید اضافه می‌کند.

درخواست اول:


POST /cart/add

درخواست بعدی:


GET /cart

برنامه باید بتواند متوجه شود که محصولی در درخواست قبلی به سبد خرید اضافه شده است.

Session یکی از ابزارهایی است که می‌تواند برای چنین سناریوهایی مورد استفاده قرار بگیرد.


چرا Session در برنامه‌های وب ضروری است؟

HTTP به‌صورت Stateless طراحی شده است.

یعنی اگر کاربر این درخواست را ارسال کند:


GET /profile

و بعد درخواست دیگری بفرستد:


GET /orders

سرور لزوماً از خود درخواست دوم نمی‌تواند بفهمد که این درخواست متعلق به همان کاربر قبلی است.

برای مدیریت چنین وضعیتی، معمولاً از مکانیزم‌هایی مانند:

  • Session
  • Cookie
  • Token
  • Authentication mechanisms

استفاده می‌شود.

Laravel نیز سیستم Session خودش را در اختیار برنامه قرار می‌دهد تا بتوانیم داده‌های موقت و اطلاعات مربوط به نشست کاربر را مدیریت کنیم.


# Session در Laravel چگونه کار می‌کند؟

به‌صورت ساده می‌توان فرآیند را این‌گونه در نظر گرفت:


Browser

   ↓

HTTP Request

   ↓

Laravel

   ↓

Session Middleware

   ↓

Session Storage

   ↓

Controller / Route / View

وقتی کاربر درخواست خود را ارسال می‌کند، Laravel در مسیر پردازش درخواست Session را در اختیار برنامه قرار می‌دهد.

اطلاعات Session می‌تواند در Storageهای مختلفی نگهداری شود.

برای مثال:


File

Database

Redis

Cookie

Memcached

بسته به Session Driver انتخاب‌شده، محل ذخیره اطلاعات متفاوت خواهد بود.


# Session در Laravel کجا مدیریت می‌شود؟

تنظیمات Session در Laravel در فایل زیر قرار دارد:


config/session.php

در این فایل تنظیماتی مانند Driver، Lifetime و برخی گزینه‌های مربوط به Cookie و امنیت Session مشخص می‌شوند.

برای مثال می‌توانید Driver مورد استفاده را از طریق فایل .env تعیین کنید:


SESSION_DRIVER=database

یا بسته به معماری پروژه از Driver دیگری استفاده کنید.

نکته مهم این است که تنظیمات Session را نباید بدون توجه به معماری پروژه انتخاب کرد.

برای یک پروژه ساده ممکن است File Session کافی باشد، اما برای یک برنامه چندسروره، استفاده از یک Storage مشترک مانند Redis یا Database می‌تواند معماری مناسب‌تری باشد.


# روش‌های مختلف استفاده از Session در Laravel

Laravel چند روش رایج برای کار با Session در اختیار ما قرار می‌دهد.

سه روش بسیار متداول عبارت‌اند از:

استفاده از Helper


session()

استفاده از Request


$request->session()

استفاده از Session Facade


Session

هر سه روش برای کار با Session کاربرد دارند و انتخاب بین آن‌ها به سبک کدنویسی و ساختار پروژه بستگی دارد.


# ذخیره اطلاعات در Session

برای ذخیره یک مقدار در Session می‌توانیم از متد put() استفاده کنیم.

مثلاً:


session()->put('name', 'Saeed');

اکنون مقدار Saeed با کلید name در Session ذخیره شده است.

می‌توانیم چند مقدار مختلف نیز ذخیره کنیم:


session()->put('name', 'Saeed');

session()->put('role', 'admin');

session()->put('language', 'fa');


ذخیره چند مقدار به‌صورت هم‌زمان

می‌توانیم یک آرایه را نیز در Session قرار دهیم:


session()->put([

    'name' => 'Saeed',

    'role' => 'admin',

    'language' => 'fa',

]);

این روش زمانی مفید است که بخواهیم چند مقدار مرتبط را در یک عملیات ذخیره کنیم.


# دریافت اطلاعات از Session

برای دریافت مقدار Session می‌توانیم از get() استفاده کنیم:


$name = session()->get('name');

اگر کلید مورد نظر وجود نداشته باشد، مقدار null دریافت می‌شود.


تعیین مقدار پیش‌فرض

می‌توانیم برای زمانی که مقدار مورد نظر وجود ندارد، مقدار پیش‌فرض مشخص کنیم:


$name = session()->get('name', 'کاربر');

اگر name در Session وجود داشته باشد، مقدار آن برگردانده می‌شود.

در غیر این صورت:


کاربر

برگردانده خواهد شد.


# استفاده از Session Helper

Laravel امکان استفاده مستقیم از Helper به نام session() را نیز فراهم می‌کند.

برای دریافت مقدار:


$name = session('name');

برای ذخیره مقدار:


session(['name' => 'Saeed']);

بنابراین در بسیاری از موارد می‌توانید بدون استفاده مستقیم از Facade با Session کار کنید.


# بررسی وجود یک مقدار در Session

گاهی نمی‌خواهیم مقدار Session را دریافت کنیم؛ فقط می‌خواهیم بدانیم آیا یک کلید وجود دارد یا خیر.

برای این کار می‌توانیم از has() استفاده کنیم:


if (session()->has('name')) {

    // Session exists

}

این روش برای بررسی وجود داده کاربرد زیادی دارد.


# تفاوت has و exists در Session

در بعضی سناریوها تفاوت وجود داشتن کلید و وجود داشتن یک مقدار غیر null اهمیت پیدا می‌کند.

برای بررسی وجود کلید می‌توان از:


session()->exists('name');

استفاده کرد.

و برای بررسی اینکه مقدار Session به شکل مورد انتظار وجود دارد، has() کاربرد دارد.

به‌همین دلیل هنگام انتخاب متد باید بدانیم دقیقاً چه چیزی را می‌خواهیم بررسی کنیم:


آیا کلید وجود دارد؟

یا

آیا مقدار قابل استفاده‌ای برای آن وجود دارد؟


# بررسی نبودن Session با missing

Laravel امکان بررسی نبودن یک مقدار را نیز فراهم می‌کند:


if (session()->missing('name')) {

    // name does not exist

}

این روش باعث می‌شود کد در بعضی شرایط خواناتر باشد.


# حذف یک مقدار از Session

اگر بخواهیم فقط یک مقدار خاص را حذف کنیم، می‌توانیم از forget() استفاده کنیم:


session()->forget('name');

در این حالت سایر داده‌های Session باقی می‌مانند و فقط name حذف می‌شود.


# حذف چند مقدار از Session

می‌توان چند کلید را نیز هم‌زمان حذف کرد:


session()->forget([

    'name',

    'role',

]);

این روش زمانی کاربردی است که بخواهیم بخشی از اطلاعات Session را پاک کنیم.


# حذف کامل Session

اگر بخواهیم تمام داده‌های Session را حذف کنیم:


session()->flush();

بعد از اجرای این دستور، اطلاعات موجود در Session پاک می‌شوند.

بنابراین باید با دقت از flush() استفاده کنید؛ مخصوصاً در پروژه‌هایی که Session برای چند قابلیت مختلف استفاده می‌شود.


# دریافت و حذف هم‌زمان یک مقدار با pull

گاهی می‌خواهیم مقدار Session را دریافت کنیم و سپس همان مقدار را حذف کنیم.

برای این کار می‌توان از:


$value = session()->pull('name');

استفاده کرد.

این قابلیت برای داده‌هایی که فقط یک بار باید مصرف شوند بسیار مفید است.


# Flash Data در Laravel چیست؟

یکی از قابلیت‌های بسیار مهم Session در Laravel، Flash Data است.

Flash Data برای اطلاعاتی استفاده می‌شود که قرار است برای مدت کوتاهی در Session وجود داشته باشند.

مثلاً فرض کنید کاربر یک محصول را با موفقیت ذخیره کرده است.

می‌خواهیم بعد از Redirect پیامی مانند:


محصول با موفقیت ذخیره شد.

نمایش داده شود.

در چنین شرایطی Flash Data انتخاب مناسبی است.


# ذخیره Flash Data

برای ذخیره یک مقدار Flash می‌توانیم از:


session()->flash('success', 'محصول با موفقیت ذخیره شد.');

استفاده کنیم.

حالا می‌توانیم در درخواست بعدی این مقدار را دریافت کنیم:


$message = session('success');


# Flash Data در Redirect

یکی از کاربردی‌ترین روش‌ها در Laravel این است که پیام را مستقیماً هنگام Redirect ارسال کنیم:


return redirect()

    ->route('products.index')

    ->with('success', 'محصول با موفقیت ایجاد شد.');

این الگو در پروژه‌های Laravel بسیار رایج است.

برای مثال در Controller:


public function store(Request $request)

{

    // Save product...



    return redirect()

        ->route('products.index')

        ->with('success', 'محصول با موفقیت ایجاد شد.');

}

سپس در Blade:


@if (session('success'))

    <div class="alert alert-success">

        {{ session('success') }}

    </div>

@endif

به این ترتیب بعد از ذخیره محصول، کاربر به صفحه لیست محصولات منتقل شده و پیام موفقیت را مشاهده می‌کند.


# نگه داشتن Flash Data برای درخواست بعدی

در حالت عادی Flash Data برای مدت محدودی در نظر گرفته شده است.

اگر لازم باشد داده Flash برای یک درخواست دیگر نیز حفظ شود، می‌توان از:


session()->reflash();

استفاده کرد.

همچنین می‌توان فقط کلیدهای خاصی را نگه داشت:


session()->keep(['success']);

این قابلیت در سناریوهای Redirectهای چندمرحله‌ای کاربرد دارد.


# استفاده از Session در Controller

یکی از رایج‌ترین محل‌های استفاده از Session، Controller است.

مثلاً:


public function store(Request $request)

{

    session()->put('last_action', 'product_created');



    return redirect()->route('products.index');

}

در درخواست بعدی می‌توانیم مقدار را دریافت کنیم:


$action = session('last_action');


# استفاده از Session از طریق Request

اگر Session را از طریق شیء Request مدیریت کنیم، کد می‌تواند به شکل زیر باشد:


public function store(Request $request)

{

    $request->session()->put('status', 'success');



    return redirect()->route('dashboard');

}

برای دریافت:


$status = $request->session()->get('status');

این روش مخصوصاً زمانی خوانا است که Session بخشی از منطق مربوط به همان Request باشد.


# استفاده از Session در Blade

در Viewهای Blade نیز می‌توان مستقیماً Session را بررسی کرد.

مثلاً:


@if (session('success'))

    <div class="alert alert-success">

        {{ session('success') }}

    </div>

@endif

برای پیام خطا:


@if (session('error'))

    <div class="alert alert-danger">

        {{ session('error') }}

    </div>

@endif

این الگو را می‌توان برای سیستم پیام‌های موفقیت، خطا، هشدار و اطلاع‌رسانی استفاده کرد.


# Session و فرم‌ها در Laravel

Session در مدیریت فرم‌ها نیز نقش مهمی دارد.

یکی از کاربردهای مهم آن نگهداری موقت اطلاعات فرم و نمایش دوباره ورودی‌های قبلی است.

مثلاً در Laravel می‌توان پس از اعتبارسنجی ناموفق، کاربر را به فرم بازگرداند.

در چنین شرایطی متد old() در Blade می‌تواند اطلاعات ورودی قبلی را در اختیار View قرار دهد:


<input

    type="text"

    name="name"

    value="{{ old('name') }}"

>

این موضوع باعث می‌شود کاربر مجبور نباشد بعد از خطای Validation تمام اطلاعات فرم را دوباره وارد کند.


# Session Driver چیست؟

Session Driver مشخص می‌کند اطلاعات Session در چه Storageای نگهداری شوند.

Laravel از Driverهای مختلفی پشتیبانی می‌کند.

از جمله:

Driverمحل نگهداری
fileفایل‌های روی سرور
databaseجدول دیتابیس
redisRedis
memcachedMemcached
cookieCookie مرورگر
arrayفقط در حافظه اجرای فعلی

انتخاب Driver به نوع پروژه و معماری سرور بستگی دارد.


# File Session چیست؟

در حالت File، اطلاعات Session در فایل‌های روی سرور ذخیره می‌شوند.

این روش برای بسیاری از پروژه‌های ساده و معمولی می‌تواند مناسب باشد.

مزیت آن:

  • راه‌اندازی ساده
  • نیاز نداشتن به سرویس جداگانه
  • مناسب برای پروژه‌های کوچک و متوسط

اما اگر برنامه روی چند سرور اجرا شود، File Session می‌تواند مشکل‌ساز شود؛ زیرا Session یک کاربر ممکن است روی یک سرور ایجاد شده باشد و درخواست بعدی او به سرور دیگری برسد.


# Database Session چیست؟

در Database Session، اطلاعات Session داخل دیتابیس ذخیره می‌شوند.

این روش برای پروژه‌هایی که می‌خواهند Session را در یک Storage مرکزی نگهداری کنند، کاربرد دارد.

برای استفاده از Database Session باید جدول مربوط به Session را در دیتابیس پروژه داشته باشید.

در نسخه‌های Laravel که این قابلیت و Artisan Command مربوط به آن را ارائه می‌کنند، می‌توانید Migration مربوط به Session را ایجاد و سپس Migrationها را اجرا کنید.

پس از آماده شدن جدول، Driver را می‌توان در .env تنظیم کرد:


SESSION_DRIVER=database

سپس:


php artisan migrate

نکته مهم این است که نام Commandهای Artisan ممکن است بین نسخه‌های Laravel متفاوت باشد؛ بنابراین در پروژه واقعی بهتر است Command موجود در همان نسخه Laravel را با:


php artisan list

بررسی کنید.


# Redis Session چیست؟

Redis یک Storage سریع در حافظه است که در پروژه‌های بزرگ‌تر و معماری‌های توزیع‌شده کاربرد زیادی دارد.

برای مثال:


SESSION_DRIVER=redis

استفاده از Redis برای Session می‌تواند زمانی مفید باشد که:

  • چند سرور Application دارید.
  • Load Balancer دارید.
  • تعداد درخواست‌ها زیاد است.
  • Session باید بین چند Instance مشترک باشد.
  • Redis از قبل در معماری پروژه وجود دارد.

برای مثال در یک معماری چندسروره:


              Load Balancer

                    |

          ---------------------

          |                   |

      Laravel 1           Laravel 2

          |                   |

          -------- Redis ------

در این معماری هر دو Application Server می‌توانند به یک Storage مشترک برای Session دسترسی داشته باشند.


# Array Session چیست؟

Array Driver برای نگهداری Session در حافظه اجرای فعلی استفاده می‌شود و معمولاً برای تست یا سناریوهای خاص مناسب است.

نباید تصور کنید که این Driver برای نگهداری دائمی Session کاربران در یک محیط Production طراحی شده است.


# Cookie Session چیست؟

در Cookie Driver، اطلاعات Session در Cookie مرورگر نگهداری می‌شوند.

از آنجا که Cookie سمت کاربر قرار دارد، استفاده از این روش باید با درک محدودیت‌های اندازه Cookie، امنیت و نوع داده‌ای که در Session قرار می‌دهید انجام شود.

به‌طور کلی نباید اطلاعات حساس و غیرضروری را بدون دلیل در Session ذخیره کنید.


# Session Lifetime چیست؟

Session معمولاً دارای مدت زمان اعتبار است.

این مدت زمان از تنظیمات Session مشخص می‌شود.

برای مثال در تنظیمات Session می‌توان Lifetime را تعیین کرد تا Session بعد از مدت مشخصی منقضی شود.

این مفهوم در برنامه‌هایی که امنیت حساب کاربری اهمیت زیادی دارد بسیار مهم است.

برای مثال:


Session Lifetime = 120 minutes

به این معناست که Session بر اساس تنظیمات برنامه، پس از مدت مشخصی منقضی خواهد شد.


# Session و Middleware در Laravel

Session در Laravel ارتباط مستقیمی با Middleware دارد.

در درخواست‌های معمول Web، Middleware مربوط به Session وظیفه دارد Session را برای چرخه Request در دسترس برنامه قرار دهد.

به همین دلیل وقتی از قابلیت‌هایی مانند:


session()

یا:


$request->session()

استفاده می‌کنیم، Session باید در مسیر Middleware مربوط به درخواست فعال باشد.

این موضوع یکی از دلایلی است که Session در مسیرهای Web معمولاً بدون تنظیمات اضافی قابل استفاده است.


# Session در Routeهای Web و API

باید بین Web Request و API Request تفاوت قائل شویم.

در بسیاری از APIها، معماری Stateless استفاده می‌شود و احراز هویت با Token انجام می‌شود.

بنابراین نباید فرض کنیم هر API الزاماً باید Session داشته باشد.

برای مثال یک API می‌تواند به این شکل کار کند:


Client

   ↓

API Request + Token

   ↓

Laravel

   ↓

Response

در مقابل، برنامه‌های Web سنتی معمولاً از Session و Cookie برای مدیریت وضعیت کاربر استفاده می‌کنند.

البته معماری‌های مدرن می‌توانند ترکیبی از این روش‌ها را نیز داشته باشند.


# Session و Authentication

یکی از مهم‌ترین کاربردهای Session، مدیریت وضعیت احراز هویت کاربر است.

به‌صورت مفهومی:


User Login

     ↓

Authentication

     ↓

Session

     ↓

User remains authenticated

بعد از ورود موفق کاربر، برنامه باید بتواند در درخواست‌های بعدی تشخیص دهد که کاربر احراز هویت شده است.

Laravel بخش Authentication را به‌صورت ساختاریافته مدیریت می‌کند و Session یکی از اجزای مهم این فرآیند در احراز هویت مبتنی بر Session است.


# Session Regeneration چیست؟

یکی از موضوعات مهم امنیتی در سیستم‌های Authentication، تغییر Session Identifier بعد از ورود موفق کاربر است.

Laravel برای این کار قابلیت‌هایی مانند:


$request->session()->regenerate();

در اختیار توسعه‌دهنده قرار می‌دهد.

این کار به کاهش ریسک‌هایی مانند Session Fixation کمک می‌کند.

در سیستم‌های Authentication بهتر است به جای مدیریت دستی و غیراصولی Session، از امکانات استاندارد Laravel استفاده کنید.


# خروج کاربر و Session

هنگام Logout نیز Session باید به‌درستی مدیریت شود.

در پیاده‌سازی‌های Authentication، معمولاً علاوه بر خروج کاربر، باید وضعیت Session نیز به شکل مناسب مدیریت شود.

در سناریوهای سفارشی، می‌توان Session را نیز Invalidate کرد:


$request->session()->invalidate();

و در صورت نیاز Token مربوط به CSRF را نیز مجدداً تولید کرد:


$request->session()->regenerateToken();

این موضوع به‌خصوص در سیستم‌های احراز هویت سفارشی اهمیت دارد.


# Session Lock چیست؟

در پروژه‌های پیشرفته، ممکن است چند درخواست هم‌زمان از یک کاربر به برنامه ارسال شود.

اگر Session در یک Storage اشتراکی مانند Database یا Redis نگهداری شود، نحوه دسترسی هم‌زمان به Session می‌تواند در بعضی معماری‌ها اهمیت پیدا کند.

برای مثال:


Request A ──┐

            ├── Session

Request B ──┘

در پروژه‌های بزرگ، مخصوصاً زمانی که درخواست‌های هم‌زمان یا عملیات طولانی دارید، باید رفتار Session Storage و Locking را در نظر بگیرید.

این موضوع در طراحی سیستم‌های پیچیده اهمیت بیشتری پیدا می‌کند و صرفاً با انتخاب Driver حل نمی‌شود.


# چه اطلاعاتی را داخل Session ذخیره کنیم؟

Session برای داده‌های کوچک و موقت مناسب است.

مثلاً:


session()->put('cart_count', 3);

یا:


session()->put('checkout_step', 2);

یا:


session()->put('locale', 'fa');

اما بهتر است اطلاعات حجیم را داخل Session قرار ندهید.

برای مثال ذخیره یک فایل بزرگ، اطلاعات بسیار حجیم محصول یا مجموعه بزرگی از داده‌های Database در Session طراحی مناسبی نیست.

به جای آن معمولاً بهتر است فقط شناسه مورد نیاز را ذخیره کنید:


session()->put('cart_id', $cart->id);

و اطلاعات کامل را هنگام نیاز از Database دریافت کنید.


# یک مثال عملی؛ ساخت سبد خرید ساده با Session

فرض کنید می‌خواهیم یک سبد خرید ساده ایجاد کنیم.

می‌توانیم شناسه محصول و تعداد آن را در Session نگهداری کنیم.

مثلاً:


session()->put('cart', [

    10 => 2,

    25 => 1,

]);

در این مثال:


Product 10 → Quantity 2

Product 25 → Quantity 1

اکنون در Controller می‌توانیم اطلاعات سبد خرید را دریافت کنیم:


$cart = session()->get('cart', []);

اگر Session وجود نداشته باشد، آرایه خالی دریافت می‌کنیم.


افزودن محصول به سبد خرید

یک پیاده‌سازی ساده:


public function addToCart($productId)

{

    $cart = session()->get('cart', []);



    if (isset($cart[$productId])) {

        $cart[$productId]++;

    } else {

        $cart[$productId] = 1;

    }



    session()->put('cart', $cart);



    return redirect()

        ->back()

        ->with('success', 'محصول به سبد خرید اضافه شد.');

}

در این مثال:

  1. سبد خرید از Session دریافت می‌شود.
  2. بررسی می‌کنیم محصول قبلاً در سبد وجود دارد یا خیر.
  3. اگر وجود داشته باشد، تعداد آن افزایش پیدا می‌کند.
  4. اگر وجود نداشته باشد، محصول جدید اضافه می‌شود.
  5. سبد خرید دوباره در Session ذخیره می‌شود.
  6. کاربر به صفحه قبلی برمی‌گردد.
  7. پیام موفقیت به‌صورت Flash Data ارسال می‌شود.

# مثال عملی؛ پیام موفقیت بعد از ذخیره اطلاعات

فرض کنید یک فرم ایجاد کاربر داریم:


public function store(Request $request)

{

    // Validate data



    // Create user



    return redirect()

        ->route('users.index')

        ->with('success', 'کاربر با موفقیت ایجاد شد.');

}

در View:


@if (session('success'))

    <div class="alert alert-success">

        {{ session('success') }}

    </div>

@endif

این یکی از رایج‌ترین کاربردهای Session در پروژه‌های Laravel است.


# تفاوت Session و Cookie چیست؟

Session و Cookie هر دو برای نگهداری اطلاعات مرتبط با کاربر استفاده می‌شوند، اما یکسان نیستند.

ویژگیSessionCookie
کاربرد اصلینگهداری وضعیت و داده‌های نشستنگهداری داده در مرورگر
محل ذخیرهبسته به Driverمرورگر کاربر
طول عمرقابل تنظیمقابل تنظیم
استفاده در Authenticationبسیار رایجمعمولاً بخشی از سیستم Session
مناسب برای داده حساسبا طراحی صحیحنیازمند ملاحظات امنیتی
حجم قابل استفادهوابسته به Driverمحدود به ظرفیت Cookie

در Laravel، این دو مفهوم ارتباط نزدیکی با یکدیگر دارند اما نباید آن‌ها را یک مفهوم واحد در نظر گرفت.

مقاله بعدی این Cluster یعنی Cookie در Laravel به‌صورت اختصاصی به Cookie و مدیریت آن خواهد پرداخت.


# اشتباهات رایج هنگام استفاده از Session

۱. ذخیره اطلاعات بسیار حجیم

Session برای نگهداری حجم زیادی از اطلاعات طراحی نشده است.

بهتر است داده‌های اصلی را در Database نگهداری کرده و فقط شناسه لازم را داخل Session قرار دهید.


۲. ذخیره اطلاعات حساس بدون دلیل

اطلاعاتی مانند:


Password

Private Key

Secret Token

اطلاعات محرمانه

نباید صرفاً به دلیل راحتی داخل Session ذخیره شوند.


۳. استفاده اشتباه از flush

این دستور:


session()->flush();

تمام داده‌های Session را حذف می‌کند.

اگر فقط می‌خواهید یک مقدار را حذف کنید:


session()->forget('key');

استفاده کنید.


۴. استفاده از Session برای APIهای Stateless

اگر API شما بر اساس Token طراحی شده است، اضافه کردن Session صرفاً برای نگهداری وضعیت معمولاً با هدف Stateless بودن API تناقض ایجاد می‌کند.

ابتدا معماری Authentication را مشخص کنید و سپس ابزار مناسب را انتخاب کنید.


۵. بی‌توجهی به محیط چندسروره

اگر Application روی چند سرور اجرا می‌شود:


Server 1

Server 2

Server 3

باید بررسی کنید Session چگونه بین سرورها به اشتراک گذاشته می‌شود.

استفاده از Storage محلی هر سرور می‌تواند باعث شود Session کاربر در درخواست‌های مختلف در دسترس نباشد.


# بهترین روش‌ها برای استفاده از Session در Laravel

برای استفاده صحیح از Session چند نکته را در نظر داشته باشید:

۱. Session را کوچک نگه دارید

فقط داده‌ای را ذخیره کنید که واقعاً لازم است.

۲. داده‌های اصلی را در Database نگهداری کنید

Session نباید جای Database را بگیرد.

۳. Driver را بر اساس معماری انتخاب کنید

پروژه ساده، پروژه چندسروره و پروژه با Redis نیازهای یکسانی ندارند.

۴. برای پیام‌های موقت از Flash Data استفاده کنید

مثلاً:


->with('success', 'عملیات با موفقیت انجام شد.')

۵. در Authentication به امنیت Session توجه کنید

خصوصاً Session Regeneration و مدیریت صحیح Logout.

۶. API و Web را از نظر Session یکسان فرض نکنید

معماری Authentication آن‌ها ممکن است کاملاً متفاوت باشد.


# جمع‌بندی

Session در Laravel یکی از ابزارهای اصلی برای مدیریت وضعیت بین درخواست‌های مختلف است.

از Session می‌توان برای مواردی مانند:

  • وضعیت ورود کاربر
  • سبد خرید
  • پیام‌های موفقیت و خطا
  • اطلاعات موقت فرم
  • مراحل چندمرحله‌ای فرم
  • تنظیمات موقت کاربر
  • برخی داده‌های موقت برنامه

استفاده کرد.

Laravel API ساده و قدرتمندی برای کار با Session در اختیار ما قرار می‌دهد. متدهایی مانند:


put()

get()

has()

exists()

missing()

forget()

flush()

pull()

flash()

reflash()

keep()

امکان مدیریت بخش‌های مختلف Session را فراهم می‌کنند.

همچنین Session می‌تواند با Driverهای مختلفی مانند File، Database و Redis کار کند و انتخاب Driver باید بر اساس نیاز و معماری پروژه انجام شود.

در پروژه‌های واقعی، مهم‌ترین نکته این است که Session را به‌عنوان محل نگهداری موقت و سبک اطلاعات ببینیم، نه جایگزینی برای Database.


# سوالات متداول درباره Session در Laravel

Session در Laravel چیست؟

Session مکانیزمی برای نگهداری اطلاعات مربوط به یک نشست کاربر بین درخواست‌های مختلف است.

چگونه در Laravel اطلاعات داخل Session ذخیره کنیم؟

با استفاده از put():


session()->put('name', 'Saeed');

چگونه مقدار Session را دریافت کنیم؟

می‌توان از get() یا Helper session() استفاده کرد:


$name = session()->get('name');

یا:


$name = session('name');

چگونه Session را حذف کنیم؟

برای حذف یک مقدار:


session()->forget('name');

برای حذف تمام داده‌های Session:


session()->flush();

Flash Session در Laravel چیست؟

Flash Data برای نگهداری اطلاعات موقتی استفاده می‌شود که معمولاً برای نمایش پیام موفقیت، خطا یا هشدار بعد از Redirect کاربرد دارد.

مثلاً:


return redirect()

    ->back()

    ->with('success', 'عملیات با موفقیت انجام شد.');

Session Driver چیست؟

Driver مشخص می‌کند اطلاعات Session در کجا ذخیره شوند؛ مانند File، Database یا Redis.

آیا می‌توان از Session در API استفاده کرد؟

از نظر فنی امکان استفاده وجود دارد، اما بسیاری از APIها به‌صورت Stateless طراحی می‌شوند و از Token به جای Session استفاده می‌کنند. انتخاب مناسب به معماری API بستگی دارد.

نظرات (0)

نظرات پس از تأیید مدیر نمایش داده می‌شوند

هنوز نظری ثبت نشده است؛ اولین نفر باشید!

مقالات مرتبط

ساخت CMS با Laravel 12؛ آموزش ساخت سیستم مدیریت محتوا از صفر

ساخت CMS با Laravel 12؛ آموزش ساخت سیستم مدیریت محتوا از صفر

۲۴ دقیقه
ساخت فروشگاه اینترنتی با Laravel 12؛ آموزش پروژه‌محور از صفر تا طراحی هسته فروشگاه

ساخت فروشگاه اینترنتی با Laravel 12؛ آموزش پروژه‌محور از صفر تا طراحی هسته فروشگاه

۲۲ دقیقه
ساخت Marketplace با Laravel؛ آموزش طراحی فروشگاه چندفروشندگی

ساخت Marketplace با Laravel؛ آموزش طراحی فروشگاه چندفروشندگی

۲۲ دقیقه
مدیریت Queueهای سنگین در Laravel؛ آموزش پردازش کارهای طولانی

مدیریت Queueهای سنگین در Laravel؛ آموزش پردازش کارهای طولانی

۲۲ دقیقه