مشخصات مقاله
-
1610
-
0.0
-
7871
-
0
-
0
آموزش Session در Laravel لاراول
Session در Laravel
- مقدمه
-
کاربرد و نحوه ی استفاده
- ذخیره ی داده ها در session برای درخواست بعدی (flash data)
- افزودن درایورهای سفارشی session
مقدمه
اپلیکیشن های تحت وب HTTP محور ناپایدار هستند (stateless بوده و اطلاعات کاربر را ذخیره نمی کنند). session ها با فراهم آوردن امکان ذخیره ی اطلاعات کاربر در بین تمامی request ها و درخواست ها، راه حل کارامدی برای رفع این مشکل به حساب می آیند. لاراول همراه با تعداد زیادی session back-end (بخش کدنویسی session) عرضه می شود که از طریق یک API متحدالشکل و بهینه قابل دسترسی و استفاده هستند.back-end های پرطرفداری همچون Memcached، Redis به صورت پیش فرض تنظیم شده و آماده مورد پشتیبانی این فریم ورک بوده و به محض نصب آن (Laravel) در اختیار توسعه دهنده قرار داده می شود.
تنظیمات session
فایل تنظیمات session در آدرس config/session.php نگهداری می شود. توصیه می شود تمامی گزینه ها و آپشن های موجود در این فایل را کاملا بررسی کنید. Laravel طوری تنظیم شده که به صورت پیش فرض از درایور file استفاده کند. درایور مذکور قطعا برای بیشتر برنامه ها پاسخگوی نیازهای شما خواهد بود. اما برای دستیابی به بازدهی بیشتر و کارایی بهینه تر session توصیه می شود در اپلیکیشن های production (مستقر شده و آماده ی بهره برداری) از دو درایور memcached و redis استفاده نمایید.
درایور session درواقع مشخص می کند داده های session هر یک از درخواست ها در کجا باید ذخیره شود. Laravel همراه با چندین driverبهینه عرضه می شود که لازم به هیچ تنظیم و ویرایشی نداشته و بلافاصله می توانند مورد بهره برداری قرار گیرند. این درایورها عبارتند از:
- file – session ها در آدرس storage/framework/sessions ذخیره می شوند.
- cookie – session ها در کوکی های رمزنگاری شده و امن ذخیره می شوند.
- database – session ها در یک پایگاه داده که اپلیکشن شما اطلاعاتش را در آن می ریزد ذخیره می شوند.
- memcached / redis – session ها در یکی از مخزن های ذخیره ی داده (data store) مبتنی بر کش نام برده (redis یا memcached) ذخیره می شوند.
- array – session ها در یک آرایه ی متعارف PHP نگهداری شده و دیگر اینکه بین درخواست ها به صورت ماندگار ذخیره نمی شوند.
درایور array معمولا برای اجرای تست واحد مورد استفاده قرار می گیرد و از اینرو هیچ اطلاعاتی به طور دائمی ذخیره نمی شوند.
ملزومات driver
پایگاه داده
در صورت استفاده از درایور database، بایستی یک جدول نیز تعریف نمایید که آیتم ها و المان های session را در خود ذخیره کند. در ادامه یک تعریف Schema نمونه برای جدول را مشاهده می کنید:
Schema::create('sessions', function ($table) {
$table->string('id')->unique();
$table->integer('user_id')->nullable();
$table->string('ip_address', 45)->nullable();
$table->text('user_agent')->nullable();
$table->text('payload');
$table->integer('last_activity');
});
می توانید دستور آرتیزان session:table را برای ایجاد migration اجرا نمایید.
php artisan session:table composer dump-autoload php artisan migrate
Redis
جهت استفاده از session های Redis در فریم ورک لاراول بایستی پکیج (~1.0) predis/predis را به وسیله ی Cpmposer نصب نمایید.
دیگر ملاحظات session
از آنجایی که Laravel از کلید flash به صورت داخلی و پیش فرض استفاده می کند، نباید آیتمی به این نام را به session اضافه نمایید.
اگر که می خواهید تمامی داده های ذخیره شده در session رمزنگاری و به اصطلاح encrypt شوند، کافی است مقدار آپشن encrypt را بر روی trueتنظیم کنید.
کاربرد و نحوه ی استفاده
دسترسی به session
حال می خواهیم به session دسترسی داشته باشیم. می توان به نمونه ی session از طریق درخواست HTTP دسترسی داشت، کافی است آن را در متد controller اعلان نوع (type-hint) نمایید. بار دیگر یادآور می شویم که تزریق dependencyهای متد کنترلر به صورت خودکار توسطservice container لاراول مدیریت می شود:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* Show the profile for the given user.
*
* @param Request $request
* @param int $id
* @return Response
*/
public function showProfile(Request $request, $id)
{
$value = $request->session()->get('key');
//
}
}
به هنگام بازیابی مقداری از session، همچنین می توانید یک مقدار پیش فرض را به عنوان آرگومان دوم به متد get ارسال نمایید. در صورت عدم وجود کلید مشخص شده (ارسال شده به عنوان آرگومان اولس) در session، مقدار پیش فرض که به عنوان آرگومان ارسال شده بود در خروجی برگردانده می شود. اگر یک تابع Closure به عنوان مقدار پیش فرض به متد get ارسال کنید. ابتدا تابع Closure اجرا می شود، سپس نتیجه ی آن به عنوان خروجی متد بازگردانده می شود.
$value = $request->session()->get('key', 'default');
$value = $request->session()->get('key', function() {
return 'default';
});
اگر می خواهید تمامی داده ها را از session استخراج کنید، کافی است متد all را فراخوانی نمایید:
$data = $request->session()->all();
می توانید تابع سراسری session را جهت واکشی و ذخیره ی اطلاعات در session مورد استفاده قرار دهید:
Route::get('home', function () {
// Retrieve a piece of data from the session...
$value = session('key');
// Store a piece of data in the session...
session(['key' => 'value']);
});
بررسی وجود یا عدم وجود یک مقدار در session
با متد فراخوانی has می توان به وجود یا عدم وجود یک آیتم در session پی برد. در صورت وجود مقدار مورد نظر در session مقدار بولی trueبرگردانده می شود:
if ($request->session()->has('users')) {
//
}
ذخیره ی داده ها در session
پس از دسترسی به نمونه ی session، می توانید مجموعه ای از توابع را برای تعامل و کار با داده های زیرساختی فراخوانی نمایید. به عنوان مثال متدput اطلاعات جدیدی را در session ذخیره می کند:
$request->session()->put('key', 'value');
اضافه کردن مقدار جدید به آرایه در session
متد push مقدار جدیدی را به مقدار session که یک آرایه است اضافه می کند. به عنوان مثال اگر کلید user.teams دربردارنده ی آرایه ای از اسامی تیم ها باشد، می توان به روش زیر مقدار جدیدی را به آرایه اضافه نمود (کلید را به عنوان آرگومان نخست و مقدار جدید را به عنوان دومین آرگومان به متد push پاس داد):
$request->session()->push('user.teams', 'developers');
بازیابی و حذف یک مقدار
متد pull یک مقدار را از session خوانده / واکشی کرده و سپس آن را برای همیشه حذف می کند:
$value = $request->session()->pull('key', 'default');
حذف مقادیری از session
متد forget مقداری را از session حذف می کند. در صورت تمایل برای حذف تمامی مقادیر، می توانید متد flush را مانند زیر صدا بزنید:
$request->session()->forget('key');
$request->session()->flush();
ایجاد مجدد ID یا شناسه ی session
چنانچه لازم است شناسه ی session را دوباره تولید کنید، می توانید برای این منظور از تابع regenerate استفاده نمایید:
$request->session()->regenerate();
ذخیره اطلاعات در session برای درخواست بعدی (flash data)
گاهی فقط داده ها را برای درخواست بعدی در session ذخیره می کنیم. برای این منظور کافی است متد flash را فراخوانی نمایید. داده هایی که با این روش در session ذخیره می شوند، فقط و فقط در درخواست های HTTP آتی دردسترس خواهند بود و بلافاصله پس از آن پاک می شوند. ذخیره ی اطلاعات به روش ذکر شده بیشتر مناسب status message های (پیغام های نشانگر وضعیت) با عمر کوتاه می باشد:
$request->session()->flash('status', 'Task was successful!');
اگر می خواهید داده های خود را برای درخواست های آتی بیشتری نگه دارید، می توانید از متد reflash استفاده کنید (اطلاعات جاری را برایsession های بعدی flash کنید). این متد کلیه ی داده های ذخیره شده در session به این روش را برای درخواست های بعدی حفظ می کند. به منظور ذخیره ی تنها بخش خاصی از اطلاعات، متد keep را بکار ببرید:
$request->session()->reflash(); $request->session()->keep(['username', 'email']); $request->session()->reflash(); $request->session()->keep(['username', 'email']);
افزودن درایورهای سفارشی session
به منظور افزودن driver هایی سفارشی به session back-end، می توان متد extend را در فاساد Session فراخوانی کرد. می توانید متدextend را (از) داخل متد boot از service provider صدا زد:
<?php
namespace App\Providers;
use Session;
use App\Extensions\MongoSessionStore;
use Illuminate\Support\ServiceProvider;
class SessionServiceProvider extends ServiceProvider
{
/**
* Perform post-registration booting of services.
*
* @return void
*/
public function boot()
{
Session::extend('mongo', function($app) {
// Return implementation of SessionHandlerInterface...
return new MongoSessionStore;
});
}
/**
* Register bindings in the container.
*
* @return void
*/
public function register()
{
//
}
}
دقت داشته باشید که درایور سفارشی شما می بایست رابط SessionHandlerInterface را پیاده سازی کند. این Interface تنها دربردانده ی چند متد ساده است که باید آن ها را پیاده سازی می کنیم. پیاده سازی MongoDB به صورت زیر خواهد بود:
<?php
namespace App\Extensions;
class MongoHandler implements SessionHandlerInterface
{
public function open($savePath, $sessionName) {}
public function close() {}
public function read($sessionId) {}
public function write($sessionId, $data) {}
public function destroy($sessionId) {}
public function gc($lifetime) {}
}
در زیر به شرح توابع این مثال و کاربرد هر یک خواهیم پرداخت:
- متد open معمولا در سیستم های ذخیره سازی session در file (file based session store systems) کاربرد دارد. از آنجایی که Laravel به صورت پیش فرض درایور file را در خود دارد، تقریبا همیشه این متد را به صورت یک تکه کد خالی رها کرده و چیزی داخل بدنه ی آن قرار نمی دهیم. اما PHP از ما می خواهد که این stub را پیاده سازی کنیم. از این امر می توان به عنوان ضعف در طراحیinterface در زبان PHP نام برد.
- متد close را می توان مانند متد open نادیده گرفت. بدین معنی که بیشتر درایورها به آن نیاز ندارند.
- متد read می بایست نسخه ی رشته ای داده های session که مربوط به پارامتر ورودی $sessionId هستند را به عنوان خروجی برگرداند. نیاز به هیچ گونه serialization یا دیگر عملیات کد گذاری به هنگام بازیابی یا ذخیره ی داده های session در driver نیست چرا که Laravel فعل serialization را به صورت خودکار انجام می دهد.
- متد write می بایست اطلاعات رشته ی ورودی $data که مربوط به پارامتر $sessionId هست را داخل یک سیستم ذخیره ی دائم اطلاعات نظیر MongoDB، Dynamo و غیره .. ذخیره کند (بنویسد).
- متد destroy بایستی داده های مرتبط با آرگومان ورودی $sessionId را از سیستم ذخیره ی دائم اطلاعات حذف کند.
- متد gc باید تمامی داده های session که قدیمی تر از مقدار مشخص شده توسط متغیر $lifetime (یک timestamp یا برچسب زمانیunix) هستند را حذف کند. برای سیستم های ذخیره اطلاعاتی همچون Memcached یا Redis که خودکار داده هایشان را حذف می کنند، این متد را می توان نادیده گرفت (تهی گذاشت).
پس از اینکه درایور session ثبت شد، می توانید درایور mongo را در فایل تنظیمات config/session.php خود بکار ببرید.