سلام دوستان این موضوع قبلا مطرح کردم چون پاسخی دریافت نکردم گفتم شاید بهتر دوباره مطرح کنم :
من در پروژه لاراولی از چندین guard استفاده کردم و حالا میخوام session لاراول رو از پیشفرض file به database تغییر بدم و جدول session در لاراول یه مقدار داره به عنوان user_id اگه من با guard ادمین با id ۱ لاگین کنم user_id میشه ۱ و اگه با guard یوزر با id ۱ لاگین کنم user_id میشه ۱ چطوری اینا رو باید از هم جدا کنم؟
@mohaligateway
سپاس از راهنماییتون همین روش استفاده کردم تقریبا جواب داد.
چون نقش و تعداد ستون ها خیلی متفاوت هست نمیتونم از permission استفاده کنم مثلا پیک و فروشنده و ...
حالا به صورت کامل کاری که کردم اینجا مینویسم شاید یکی دیگم به این مشکل برخورد کنه:
۱- تغییر جدول session :
Schema::create('sessions', function (Blueprint $table) {
$table->string('id')->primary();
$table->nullableMorphs('user');
$table->string('ip_address', 45)->nullable();
$table->text('user_agent')->nullable();
$table->text('payload');
$table->integer('last_activity')->index();
});
*نکته : مقدار nullableMorphs دوتا سلول برای ما ایجاد میکنه user_id و user_type
۲-در فودر App\Exceptions یه فایل با نام DatabaseSessionHandler ایجاد میکنیم که extends شده از DatabaseSessionHandler i هسته لاراول کد :
<?php
namespace App\Exceptions;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Session\DatabaseSessionHandler as BaseDatabaseSessionHandler;
class DatabaseSessionHandler extends BaseDatabaseSessionHandler
{
/**
* Get the currently authenticated user's type.
*
* @return mixed
*/
protected function userType()
{
$user = $this->container->make(Guard::class)->user();
return optional($user)->getMorphClass();
}
/**
* Add the user information to the session payload.
*
* @param array $payload
* @return $this
*/
protected function addUserInformation(&$payload)
{
if ($this->container->bound(Guard::class)) {
$payload['user_id'] = $this->userId();
$payload['user_type'] = $this->userType();
}
return $this;
}
}
3- کد زیر را در متد boot فایل AppServiceProvider بنویسید یا یک Provider با نام SessionProvider ایجاد کنید و آنرا در config.php اتفاده کنید کد :
$this->app['session']->extend('database', function($app){
$connection = Config::get('session.connection');
$table = Config::get('session.table');
$minutes = Config::get('session.lifetime');
return new DatabaseSessionHandler(
$this->app['db']->connection($connection),
$table,
$minutes,
$app
);
});
حالا به راحتی میتونید با قرار دادن متد زیر در model های خود از سشن های اون کاربر استفاده کنید :
public function sessions()
{
return $this->morphMany(Session::class, 'user');
}
@mohaligateway
سلام وقت بخیر.
در لاراول پیشفرض یه جدول session داره که نشست های کاربر درونش ذخیره میکنه.
این جدول :
Schema::create('sessions', function (Blueprint $table) {
$table->string('id')->primary();
$table->foreignId('user_id')->index()->nullable()->references('id')->on('users');
$table->string('ip_address', 45)->nullable();
$table->text('user_agent')->nullable();
$table->text('payload');
$table->integer('last_activity')->index();
});
حالا من چون دارم از چندین guard استفاده میکنم به شکل زیر :
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
'admin'=>[
'driver' => 'session',
'provider' => 'admins'
],
'delivery'=>[
'driver' => 'session',
'provider'=>'deliveries',
],
'supplier'=>[
'driver'=>'session',
'provider'=>'suppliers',
],
],
الان اینجوریه که مقدار user_id که در جدول session ثبت میشه هم میتونه id جدول user و هم id جدول supplier و ... باشه و اینجوری یه سشن برای دوکاربر با id یکسان که در جداول متفاوت قرار دارن ثبت میشه و مشکل اینه
بهتره که برای اینگه موارد از Role و Permission استفاده کنی. اگه امکانش رو داری. اکثرا الان پروژه ها به این شکل اجرا میشن. اما اگر می خوای از روش guard استفاده کنی در کنار user_id یک ستون اضافه کن برای ثبت مدلی که session از اون میاد. مثلا App\Admin و ... و داخل middleware و یا هرجائی که می خواهی چک کنی می تونی از با استفاده از این ستون تفاوت ایجاد منی.
@imamaad
@mohaligateway
سپاس از راهنماییتون همین روش استفاده کردم تقریبا جواب داد.
چون نقش و تعداد ستون ها خیلی متفاوت هست نمیتونم از permission استفاده کنم مثلا پیک و فروشنده و ...
حالا به صورت کامل کاری که کردم اینجا مینویسم شاید یکی دیگم به این مشکل برخورد کنه:
۱- تغییر جدول session :
Schema::create('sessions', function (Blueprint $table) {
$table->string('id')->primary();
$table->nullableMorphs('user');
$table->string('ip_address', 45)->nullable();
$table->text('user_agent')->nullable();
$table->text('payload');
$table->integer('last_activity')->index();
});
*نکته : مقدار nullableMorphs دوتا سلول برای ما ایجاد میکنه user_id و user_type
۲-در فودر App\Exceptions یه فایل با نام DatabaseSessionHandler ایجاد میکنیم که extends شده از DatabaseSessionHandler i هسته لاراول کد :
<?php
namespace App\Exceptions;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Session\DatabaseSessionHandler as BaseDatabaseSessionHandler;
class DatabaseSessionHandler extends BaseDatabaseSessionHandler
{
/**
* Get the currently authenticated user's type.
*
* @return mixed
*/
protected function userType()
{
$user = $this->container->make(Guard::class)->user();
return optional($user)->getMorphClass();
}
/**
* Add the user information to the session payload.
*
* @param array $payload
* @return $this
*/
protected function addUserInformation(&$payload)
{
if ($this->container->bound(Guard::class)) {
$payload['user_id'] = $this->userId();
$payload['user_type'] = $this->userType();
}
return $this;
}
}
3- کد زیر را در متد boot فایل AppServiceProvider بنویسید یا یک Provider با نام SessionProvider ایجاد کنید و آنرا در config.php اتفاده کنید کد :
$this->app['session']->extend('database', function($app){
$connection = Config::get('session.connection');
$table = Config::get('session.table');
$minutes = Config::get('session.lifetime');
return new DatabaseSessionHandler(
$this->app['db']->connection($connection),
$table,
$minutes,
$app
);
});
حالا به راحتی میتونید با قرار دادن متد زیر در model های خود از سشن های اون کاربر استفاده کنید :
public function sessions()
{
return $this->morphMany(Session::class, 'user');
}
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟