لارافيل, Others / 2024-09-16

ما هي الجلسات Sessions في لارافيل؟ وما هي الدوال للتعامل معها؟

ما هي الجلسات Sessions في لارافيل؟ وما هي الدوال للتعامل معها؟

2024-09-16 وقت القراءه : 6 دقائق

جدول المحتويات


إذا كنت من مستخدمي الإنترنت النشطين، فمن المحتمل إنك شاهدت هذه العبارة “Your Session has expirted”، والتي تظهر عاده عند فتح صفحة بها تسجيل دخول بعد فترة طويلة من عدم النشاط، حيث لا يتم تسجيل الدخول بشكل تلقائي.

 

تلعب الجلسات Sessions دوراً مهماً في أي تطبيق نقوم ببناءة، فهي تساعد في حفظ البيانات والحصول عليها من أي مكان ( صفحة ) في التطبيق.

 

أمثلة على إستخدام sessions:-

  • عند تسجيل الدخول في لارافيل، فإن إسم المستخدم الذي سجل الدخول نستطيع الوصول إليه في أي صفحة داخل التطبيق.
  • في إعدادات اللغة عند أختيار لغة معينة، فإن هذه اللغة تبقى هي المستخدمة في الموقع حتى بعد التنقل إلى صفحات أخرى.
  • لفرض إنك تريد تعيين قيمة معينة أو إسم في صفحة معينة، وتريد استخدام هذه القيمة في صفحات أخرى فإننا نستخدم sessions.

 

بالتالي نستنتج أن الجلسات sessions هي طريقة مبسطة لحفظ البيانات، من خلال معرف معين key، ونستطيع الوصول لهذه البيانات من خلال هذا المعرف.

 

 

أنواع الجلسات Sessions التي يدعمها إطار العمل لارافيل؟

لو ذهبنا إلى الملف

 config/sessions.php 

سوف نجد مجموعة من الأنواع drivers وهي :

  • File: حيث يتم تخزين sessions في المسار storage/app/framework/sessions.
  • Cookie: يتم التخزين في الـ cookies لكن بشكل أمن ومشفر، أي يتم حفظها في المتصفح الذي تعمل عليه.
  • Database: يتم تخزين البيانات في قواعد البيانات.
  • Memcached/redis : وهي خدمات تجارية يتم حفظ البيانات عليها وتتميز بالسرعة العالية.
  • Array: يتم تخزين البيانات في مصفوفة php.

 

ولو نظرنا للملف config/sessions.php نجد أن الـ driver الإفتراضي هو file

'driver' => env('SESSION_DRIVER', 'file')

بمعنى أنه سيتم تخزين بيانات sessions في ملفات حيث توجد في المسار 

Storage/app/framework/cache/sessions

كما يحتوي الملف config/sessions.php على بعض الإعدادات الأخرى مثل:-

  • lifetime : وقت إنتهاء الجلسة إذا لم يكن هناك تفاعل من المستخدم مع الموقع وهي بالوضع الإفتراضي 120 ثانية.
'lifetime' => env('SESSION_LIFETIME', 120),

 

  • Expire_on_close: وتعني أن يتم الإنتهاء من الجلسة بعد أن يتم إغلاق الموقع وقيمتها false.
'expire_on_close' => false,

 

بالطبع إذا أردنا تغيير إعدادات sessions الإفتراضية لا يجب أن يتم تغييرها في هذا الملف، بل يجب القيام بذلك في الملف .env

SESSION_DRIVER=file
SESSION_LIFETIME=120

 

كيفية إستخدام الجلسات Sessions لتخزين البيانات في لارافيل؟

لتخزين البيانات يوجد طريقتين:-

الطريقة الأولى :  إستخدام الدالة المساعده   helper   function وهي session

session(['key'=>'value']);

حيث يجب تحديد مفتاح وقيمة مثلا

public function index(){
    session(['name'=>'ethar']);
}


الطريقة الثانية : إستخدام Request instance

public function index(Request $request){
    $request->session()->put(['lang'=>'php']);// array
    $request->session()->put('lang', 'laravel');//single value
}


إضافة قيم جديده للمصفوفة

إذا كان لدي session عبارة عن مصفوفة أي تحمل أكثر من قيمة يمكن إستخدام push

$request->session()->push('programing.lang', 'laravel');

كما تقوم هذه الدالة بإنشاء session عبارة عن مصفوفة إن لم تكن موجوده وإذا كانت موجوده يتم إضافة العناصر لها.


قراءة Sessions في لارافيل.

كما في حفظ sessions فإنه يوجد طريقتين للوصول إلى قيم sessions وهما:

الطريقة الأولى : دالة sessions

session('name');
session('programing.lang');

أي نطلب session من خلال المفتاح الذي تم تحديد مسبقا عند إنشاء session.


الطريقة الثانية :

public function getSession(Request $request){
    return $request->session()->get('name');
}


التحقق إذا كانت Session تحتوي على قيمة معينة.

بإستخدام الدالة has فإننا نستطيع تحديد إذا كانت قيمة معينة للجلسة موجوده أم لا، حيث ترجع true إذا كانت موجوده وإذا لم تكن موجوده ترجع null

public function getSession(Request $request){
    if($request->session()->has('name')){
        return 'exist';
    }
}


إعادة توليد Session IDS.

يتم إعادة توليد session id بهدف منع عمليات الإختراق من ثغرة session fixation.

بالوضع الإفتراضي تقوم لارافيل بذلك أثناء عملية التسجيل إذا كنا نستخدم LoginController الإفتراضي في عملية تسجيل الدخول، لكن إذا أردنا القيام بذلك بشكل تلقائي يمكننا ذلك، بإستخدام الدالة regenerate فإننا نستطيع إعاده توليد session id

public function regenerateSessionId(Request $request){
    $request->session()->regenerate();
    return view('contact');
}



زيادة وإنقاص incrementing & decrementing قيمة الجلسة session

إذا كانت قيمة session من نوع integer فإننا نستطيع زيادة وإنقاص هذه القيمة بإستخدام دوال increment و decrement

public function index(Request $request){
    $request->session()->increment('count');
    $request->session()->increment('count', $incrementBy = 2);
    $request->session()->decrement('count');
    $request->session()->decrement('count', $decrementBy = 2);
}


حفظ البيانات فقط للطلب التالي Flash Data

ببعض الأحيان نرغب فقط أن يتم تخزين session الجلسة فقط للطلب التالي، وسيتم حذفها بشكل تلقائي بعد تنفيذ الطلب، على سبيل المثال عند إضافة مقال فإننا نعود لصفحة الإضافة مع رسالة نجاح العملية، وهذه الرسالة لا تعمل في الصفحات التالية

$cat=new MainCat();
$cat->title=$request->title_ar;
$cat->save();
return redirect('/admin/maincats')->with('success','تم إضافة القسم بنجاح');

or

$request->session()->flash('status', 'Task was successful!');

أما إذا كنا نريد أن يتم حفظ بيانات الجلسة فقط للطلب الحالي، بالإمكان إستخدام دالة now

$request->session()->now('status', 'Task was successful!');


حذف Sessions

بإستخدام الدالة forget فإننا نستطيع حذف قيمة معينة، حيث يجب تمرير key

public function deleteSession(Request $request, $key){
    $request->session()->forget($key);
}
public function deleteSession(Request $request){
    $request->session()->forget(‘name’);
}


كما يمكن حذف جميع Sessions بإستخدام الدالة flush

public function deleteAllSession(Request $request){
    $request->session()->flush();
}

التعليقات
tohami
منذ سنة

good 📯

إضافة تعليق
Loading...