phpmongodbauthenticationlaravel-11

Laravel 11 with MongoDb get error "Call to a member function prepare() on null"


In laravel 11 I get the error while login. Now the error occured on createToken method.

Controller

  public function login($request)
    {
        $request->validate([
            'email' => 'required|email',
            'password' => 'required',
        ]);

        $member = Member::where('email', $request->email)->first();

        if (!$member || !Hash::check($request->password, $member['password'])) {
            return response()->ErrorResponse('Email or password is incorrect.');
        }
        Auth::login($member);
        $token = $member->createToken('Personal Access Token')->plainTextToken;
        return response()->SuccessResponse($member);
   }

The code works till the line Auth::login($member). When I call the CreateToken the error occurs.

Model/Member.php

 namespace App\Models;

 use MongoDB\Laravel\Eloquent\Model;
 use Laravel\Sanctum\HasApiTokens;
 use MongoDB\Laravel\Auth\User as Authenticatable;

 class Member extends Authenticatable
 {
  use HasApiTokens;

  protected $connection = 'mongodb';
  protected $collection = 'Members';

  protected $fillable = [
    'userName', 'email', 'status', 'createdDate', 'password'
  ];

  protected $casts = [
    'createdDate' => 'datetime',
    
  ];

}

config/auth.php

  'guards' => [

     'api' => [
        'driver' => 'mongodb',
        'provider' => 'members',
        'hash' => false,
     ],
  ],
 
   'providers' => [
    'members' => [
        'driver' => 'eloquent',
        'model' => App\Models\Member::class,
    ],
  ],

Solution

  • To use Laravel Sanctum with Laravel MongoDB, modify the PersonalAccessToken model provided by Sanctum to use the DocumentModel trait from the MongoDB\Laravel\Eloquent namespace.

    Created Model Models/PersonalAccessToken.php

    namespace App\Models;
    
    use Laravel\Sanctum\PersonalAccessToken as SanctumToken;
    use MongoDB\Laravel\Eloquent\DocumentModel;
    
    
    class PersonalAccessToken extends SanctumToken
    {
      use DocumentModel;
      protected $connection = 'mongodb';
      protected $collection = 'personal_access_tokens';
      protected $primaryKey = '_id';
      protected $keyType = 'string';
    
    }
    

    Reference : https://www.mongodb.com/docs/drivers/php/laravel-mongodb/v4.6/user-authentication/#std-label-laravel-user-auth-sanctum