جدول المحتويات
إذا كنت من مستخدمي الإنترنت النشطين، فمن المحتمل إنك شاهدت هذه العبارة “Your Session has expirted”، والتي تظهر عاده عند فتح صفحة بها تسجيل دخول بعد فترة طويلة من عدم النشاط، حيث لا يتم تسجيل الدخول بشكل تلقائي.
تلعب الجلسات Sessions دوراً مهماً في أي تطبيق نقوم ببناءة، فهي تساعد في حفظ البيانات والحصول عليها من أي مكان ( صفحة ) في التطبيق.
بالتالي نستنتج أن الجلسات sessions هي طريقة مبسطة لحفظ البيانات، من خلال معرف معين key، ونستطيع الوصول لهذه البيانات من خلال هذا المعرف.
لو ذهبنا إلى الملف
config/sessions.php
سوف نجد مجموعة من الأنواع drivers وهي :
ولو نظرنا للملف config/sessions.php نجد أن الـ driver الإفتراضي هو file
'driver' => env('SESSION_DRIVER', 'file')
بمعنى أنه سيتم تخزين بيانات sessions في ملفات حيث توجد في المسار
Storage/app/framework/cache/sessions
كما يحتوي الملف config/sessions.php على بعض الإعدادات الأخرى مثل:-
'lifetime' => env('SESSION_LIFETIME', 120),
'expire_on_close' => false,
بالطبع إذا أردنا تغيير إعدادات sessions الإفتراضية لا يجب أن يتم تغييرها في هذا الملف، بل يجب القيام بذلك في الملف .env
SESSION_DRIVER=file SESSION_LIFETIME=120
لتخزين البيانات يوجد طريقتين:-
الطريقة الأولى : إستخدام الدالة المساعده 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
session('name'); session('programing.lang');
أي نطلب session من خلال المفتاح الذي تم تحديد مسبقا عند إنشاء session.
الطريقة الثانية :
public function getSession(Request $request){ return $request->session()->get('name'); }
بإستخدام الدالة has فإننا نستطيع تحديد إذا كانت قيمة معينة للجلسة موجوده أم لا، حيث ترجع true إذا كانت موجوده وإذا لم تكن موجوده ترجع null
public function getSession(Request $request){ if($request->session()->has('name')){ return 'exist'; } }
يتم إعادة توليد session id بهدف منع عمليات الإختراق من ثغرة session fixation.
بالوضع الإفتراضي تقوم لارافيل بذلك أثناء عملية التسجيل إذا كنا نستخدم LoginController الإفتراضي في عملية تسجيل الدخول، لكن إذا أردنا القيام بذلك بشكل تلقائي يمكننا ذلك، بإستخدام الدالة regenerate فإننا نستطيع إعاده توليد session id
public function regenerateSessionId(Request $request){ $request->session()->regenerate(); return view('contact'); }
إذا كانت قيمة 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); }
ببعض الأحيان نرغب فقط أن يتم تخزين 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!');
بإستخدام الدالة 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 📯