سلام خدمت دوستان گرامی!
این اولین پست من تو سایت ویرگوله.
امیدوارم که بتونم از تجربیاتم در لاراول و مباحث دیگر در اینجا به اشتراک بزارم.
سوال: چگونه از لاراول پاسپورت و MongoDB باهم تو لاراول استفاده کنیم؟!
بعد از نصب لاراول, اول از همه باید پکیج mongoDB را با استفاده از کامند زیر نصب کنید:
composer require mongodb/laravel-mongodb:^4.1
اضافه کردن تنظیمات مونگو در فایل کانفیگ database.php
'connections' => [
'mongodb' => [
'driver' => 'mongodb',
'dsn' => env('DB_URI', 'mongodb://127.0.0.1:27017'),
'database' => env('DB_DATABASE', 'mydatabase'),
],
],
ویرایش مدل ها برای مثال:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
// قراردادن کلاس مدل پکیج نصب شده به جای مدل پیش فرض
use MongoDB\Laravel\Eloquent\Model;
// استفاده از سافت دیلیت خود پکیج
use MongoDB\Laravel\Eloquent\SoftDeletes;
class Visitor extends Model
{
use HasFactory, SoftDeletes;
// از هردو مورد فیل ایبل یا گاردد میشه استفاده کرد ولی فیل ایبل بهتره
protected $fillable = ['ip', 'visitable_id', 'visitable_type'];
protected $guarded = ['_id'];
public function visitable(){
return $this->morphTo();
}
}
و یا اینکه یک کلاس Model.php بسازید و همه موارد مورد نیاز پایه رو در اون قرار بدید. تو مدل های دیگه ازش ارث بری کنید. اینجوری اگه خواستین دیتابیستون رو تغییر بدید دیگه نیاز نیست همه مدل هارو ویرایش کنید فقط فایل Model.php رو تغییر بدید کافیه.
قسمت مهم ماجرا اینجاست!
برای استفاده از لاراول پاسپورت جهت احراز هویت ابتدا یک فایل باید ایجاد کنیم در آدرس :
App\Console\Commands
به اصطلاح یک کامند سفارشی ایجاد کنیم.
میتونید به صورت دستی بسازید و یا با کامند خود لاراول هم بسازید:
php artisan make:command PassportMongoDB
محتوای فایل را از گیت هاب من میتونید بردارید و داخل فایلتون بزارید.
بعد از نصب لاراول پاسپورت برای اینکه بتوینم از کامند php artisan passport:install برای ایجاد کلیدها استفاده کنیم, بعد از ساخت فایل بالا طبق کامندی که تعریف کردیم باید استفاده کنیم:
php artisan change:passport
این کامند به داخل پکیج پاسپورت رفته و تمامی فایلایی که از Model خود لاراول ارث بری کردند را تغییر میدهد
چنانچه خواستید به تنظیمات قبلی برگردید از کامند رول بکش باید استفاده کنید:
php artisan change:passport --rollback
بعد از انجام موارد بالا باید در مدل کاربر یا ادمین تغییراتی انجام دهیم:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use MongoDB\Laravel\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
protected $fillable = [
'name',
'email',
'password',
'email_verified_at',
];
protected $hidden = [
'password',
'remember_token',
];
protected $casts = [
'email_verified_at' => 'datetime',
'password' => 'hashed',
];
}
تغییرات در فایل کانفیگ auth.php :
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'user-api' => [
'driver' => 'passport',
'provider' => 'users',
],
'user' => [
'driver' => 'session',
'provider' => 'users',
],
],
از گارد user برای قسمت سشن استفاده میشه و از گارد user-api برای api ها
نکته برای اینکه از اسکوپ در پاسپورت استفاده کنیم باید مواردی را در AuthServiceProcider.php
در متود boot قرار بدیم:
public function boot(): void
{
Passport::tokensCan([
'user' => 'user',
'admin' => 'admin',
]);
}
کنترلر مربوط به احراز هویت:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
class TestController extends Controller
{
public function login(Request $request)
{
if(Auth::guard('user')->attempt(['email' => $request->email, 'password' => $request->password])){
$user = User::query()->firstWhere('email', $request->email);
$response = $user;
$response['token'] = $user->createToken('login', ['user'])->accessToken;
return response()->json([
'status' => true,
'message' => 'با موفقیت وارد شدید',
'user' => $response
]);
}else {
return response()->json([
'status' => false,
'message' => 'اطلاعات ورودی شما اشتباه میباشد.'
]);
}
}
}