session (سشن) در لاراول (laravel) همراه با نکات کلیدی

session (سشن) در لاراول (laravel) همراه با نکات کلیدی

برنامه های سمت وب ناپایدرا هستند و اطلاعات کاربر را ذخیره نمی کنند پس باید اطلاعات درخواست ها در جایی نگهداری شود تا در صورت مورد نیاز شدن بتوان از آن استفاده کرد session راهی برای نگهداری این اطلاعات در درخواست ها یا پاسخ ها می باشد لاراول یک سیستم یکپارچه برای استفاده از session ها در اختیار شما قرار میدهد که بدون دردسر و با راحترین شکل ممکن می توانید از سشن استفاده کنید در لاراول به صورت پیش فرض session ها به صورت فایل ذخیره می شوند امام شما می توانید نحوه ذخیره و استفاده را تغییر دهید از  Memcached, Redis,  یا دیتابیس برای این عملیات استفاده کنید

زمان مطالعه: 3 دقیقه
بازدید: 2512
پرسش و پاسخ: 0

تنظیمات session در لاراول

فایل تنظیمات session در مسیر config/session.php ذخیره شده است شما می توانید برای هرگونه تغییری در نحوه ذخیره سازی و ... session به این فایل مراجعه کنید session ها به صورت پیش فرض به صورت فایل در لاراول ذخیره می شوند اما شما می توانید از memcached یا redis برای ذخیره و بارگذاری بسیار سریعتر Sessionها استفاده کنید. این فایل همچنین شامل گزینه های مختلف برای ذخیره سازی انواع مختلف درخواست ها یا پاسخ ها می باشد:

  1. file  ها در آدرس storage/framework/sessions ذخیره می شوند.
  2. cookie  ها در کوکی های رمزنگاری شده و امن ذخیره می شوند.
  3. database  ها در یک پایگاه داده که اپلیکشن شما اطلاعاتش را در آن می ریزد ذخیره می شوند.
  4. memcached / redis  ها در یکی از مخزن های ذخیره ی داده (data store) مبتنی بر کش نام برده (redis یا memcached) ذخیره می شوند.
  5. array  ها در یک آرایه ی متعارف PHP نگهداری شده و دیگر اینکه بین درخواست ها به صورت ماندگار ذخیره نمی شوند.

نکته : درایور آرایه در طول آزمایش (تست) استفاده می شود و از ذخیره داده های ذخیره شده به صورت دائمی در جلسه جلوگیری می کند.

آموزش عملی لاراول به صورت درس به درس: آموزش لاراول

پیش نیاز (ملزومات) ذخیره سازی session در لاراول

ذخیره session در دیتابیس

وقتی درایور session را با database مقداردهی کنید یک جدول با عنوان sessions در دیتابیس خود ایجاد کنید تا session های ایجاد شده در جدول مورد نظر نگه داری شود جدول شما باید به صورت ذیل باشد :

Schema::create('sessions', function ($table) {
    $table->string('id')->unique();
    $table->unsignedInteger('user_id')->nullable();
    $table->string('ip_address', 45)->nullable();
    $table->text('user_agent')->nullable();
    $table->text('payload');
    $table->integer('last_activity');
});

برای ایجاد این جدول در دیتابیس خود به ترتیب دستورات ذیل را اجرا کنید

php artisan session:table

php artisan migrate

استفاده از Redis برای نگه داری session ها

اول باید Redis را نصب کنید با استفاده از کامپوزر predis/predis را نصب کنید سپس می توانید کانکشن خود در دیتابیس را برابر با redis کنید تا session  در دیتابیس موقتی redis برای شما نگهداری شود.

استفاده از Session در لاراول

بازیابی داده ها

برای دستیابی به دادهای ذخیره شده در یک session در لاراول دو راه وجود دارد از طریق session های عمومی و از طریق Request می توان دسترسی داشت. اول به نحوه دسترسی از طریق Request ها اشاره می کنیم به مثال ذیل توجه کنید :

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * Show the profile for the given user.
     *
     * @param  Request  $request
     * @param  int  $id
     * @return Response
     */
    public function show(Request $request, $id)
    {
        $value = $request->session()->get('key');

        //
    }
}

شما می توانید با بازیابی داده های یک session مقدار پیش فرض نیز به عنوان آرگومان دوم برای آن مشخص کنید

$value = $request->session()->get('key', 'default');

$value = $request->session()->get('key', function () {
    return 'default';
});

کمک کننده Session عمومی لاراول

شما می توانید از کمک کننده session در php برای ذخیره و بازیابی داده ها استفاده کنید. وقتی session  را با می خواهید فراخوانی و به دیتای آن دسترسی داشته باشید فقط کافیست اولین آرگومان آن را با نام session که از قبل ذخیره کرده اید مقدار دهی کنید. برای ذخیره یک دیتا در session ، اولین آرگومان نام آن و آرگومان دوم دیتای شما برای ذخیره سازی خواهد بود.

Route::get('home', function () {
    // Retrieve a piece of data from the session...
    $value = session('key');

    // Specifying a default value...
    $value = session('key', 'default');

    // Store a piece of data in the session...
    session(['key' => 'value']);
});

بازیابی کل session ها در لاراول

برای بازیابی تمام داده ها می توانید از متد all در نمونه Request خود استفاده کنید :

$data = $request->session()->all();

تعیین وجود یا عدم وجود یک مقدار در Session لاراول

با استفاده از متد has می توانید بررسی کنید که آیا یک مقدار در session ها وجود دارد ( آیا session با نام مورد نظر وجود دارد یا نه ) که در صورت موجود بودن مقدار true و در غیر اینصورت مقدار null بر می گرداند :

if ($request->session()->has('users')) {
    //
}

گاهی نیز باید وجود خود یک session با یک نام را مضخص کنید فارق از اینکه مقدار null دارد یا مقداردهی شده است پس از متد exists استفاده می کنید :

if ($request->session()->exists('users')) {
    //
}

ذخیره داده در session لاراول

برای ذخیره داده ها در لاراول از متد put یا کلید و مقدار استفاده می شود:

// Via a request instance...
$request->session()->put('key', 'value');

// Via the global helper...
session(['key' => 'value']);

افزودن مقدار جدید به آرایه در session

با استفاده از متد push می توانید یک مقدار جدید را به آرایه در session خود اضافه کنید مثلا اگر کلید دسترسی به آرایه شامل کاربران و تیم آنها باشد با استفاده از کلید user.teams می توانید یک تیم جدید اضافه کنید :

$request->session()->push('user.teams', 'developers');

حذف یک مقدار در session

با استفاده از متد pull می توانید یک مقدار در session را با کلید آن مقدار بازیابی و حذف کنید :

$value = $request->session()->pull('key', 'default');

متد flash در session لاراول

بعضی اوقات ممکن است بخواهید موارد مورد نیاز خود را در جلسه فقط برای درخواست بعدی ذخیره کنید. ممکن است این کار را با استفاده از متد flash انجام دهید. داده های ذخیره شده در جلسه با استفاده از این متد فقط در صورت درخواست HTTP بعدی در دسترس خواهند بود و سپس حذف می شوند. داده های flash در درجه اول برای پیام های وضعیت کوتاه مدت مفید است:

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

اگر لازم است داده های flush خود را برای چندین درخواست نگه دارید ، می توانید از روش reflash استفاده کنید ، که تمام داده های flash را برای یک درخواست اضافی نگه می دارد. اگر فقط به نگه داشتن داده های خاص flush نیاز دارید ، می توانید از متد Keep استفاده کنید:

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

$request->session()->keep(['username', 'email']);

حذف session در لاراول

با متد forget می توانید یک session را با استفاده از نام آن حذف کنید. اگر می خواهید کل session ها را از بین ببرید باید از متد flush استفاده کنید. به مثال های ذیل توجه کنید :

// Forget a single key...
$request->session()->forget('key');

// Forget multiple keys...
$request->session()->forget(['key1', 'key2']);

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

تولید دوباره session id در لاراول

تولید دوباره session id  برای جلوگیری از سوء استفاده کابران برای استفاده از session دیگران استفاده می شود. لاراول به صورت اتوماتیک session id را هنگام احراز هویت دوباره مقداردهی می کند ولی اگر می خواهید خودتان این کار را به صورت دستی انجام دهید می توانید از متد regenerate برای این منظور استفاده کنید :

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

افزودن درایو های سفارشی session در لاراول

ارث بری از درایورها در لاراول

برای تعریف درایور جدید در لاراول، باید از کلاس SessionHandlerInterface ارث بری کنید این interface شامل چند متد ساده می باشد که در مثال ذیل مشهود می باشد. پیاده سازی درایور MongoDb به صورت ذیل خواهد بود :

<?php

namespace App\Extensions;

class MongoSessionHandler 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 جدید در لاراول

پس از ارث بری و ساختن یک درایور جدید باید آن را در چارچوب خود لاراول اضافه کنید. برای افزودن درایور جدید خود ممکن است از روش extends در فاساد session استفاده کنید برای این کار باید در متد boot کلاس SessionServiceProvider درایور خود را به روش ذیل اضافه کنید :

<?php

namespace App\Providers;

use App\Extensions\MongoSessionHandler;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\ServiceProvider;

class SessionServiceProvider extends ServiceProvider
{
    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Session::extend('mongo', function ($app) {
            // Return implementation of SessionHandlerInterface...
            return new MongoSessionHandler;
        });
    }
}

پس از ثبت درایور session، می توانید از درایور mongo در پیکربندی config / session.php خود استفاده کنید.

بهزاد میرزازاده
مسیر درست با پرسش های درست ساخته می شود

مشاهده تمام مطالب نویسنده