如何解决用户登录时,在 Laravel 8.x 中调用成员函数 prepare() on null
我使用 Laravel Sanctum 认证系统,用户想登录,提示如下错误。
"message": "Call to a member function prepare() on null","exception": "Error","file":"C:\\wamp64\\www\\mylaravel\\mytest\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Connection.php","line": 465
我使用 MongoDB 作为我的数据库。
我使用的版本:
- Laravel 版本:8.27.0
- PHP 版本:7.3.21
我尝试了很多解决方案,但没有一个解决方案适合我在 Laravel 8 上使用。
这是我的用户模型
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
//use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use DB;
use Laravel\Sanctum\HasApiTokens;
use \MongoDB\Operation\FindOneAndUpdate;
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
use Illuminate\Auth\Authenticatable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Foundation\Auth\Access\Authorizable;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
class User extends Eloquent implements AuthenticatableContract,AuthorizableContract,CanResetPasswordContract
{
use HasFactory,Notifiable,Authenticatable,Authorizable,HasApiTokens,CanResetPassword;
protected $connection = "mongodb";
protected $collection = "users";
// public $timestamps = false;
public function nextid()
{
// ref is the counter - change it to whatever you want to increment
$this->_id = self::getID();
}
public static function bootUseAutoIncrementID()
{
static::creating(function ($model) {
$model->sequencial_id = self::getID($model->getTable());
});
}
public function getCasts()
{
return $this->casts;
}
private static function getID()
{
$seq = DB::connection('mongodb')->getCollection('counters')->findOneAndUpdate(
['_id' => '_id'],['$inc' => ['seq' => 1]],['new' => true,'upsert' => true,'returnDocument' => FindOneAndUpdate::RETURN_DOCUMENT_AFTER]
);
return $seq->seq;
}
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name','email','password','roles',];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password','remember_token',];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',];
}
这是我的控制器
namespace App\Http\Controllers;
use Validator;
use Auth;
use Arr;
use App\Models\User;
use Illuminate\Http\Request;
class ApiController extends Controller
{
/**
* Register User
* @param Request $request
* @return Boolean $result
*/
public function register(Request $request)
{
$validator = Validator::make($request->all(),[
"name" => "required","email" => "required|email","password" => "required|min:8"
]);
if($validator->fails()){
return response()->json([
'status' => 400,'message' => "Bad Request"
],400);
}
$user = new User();
$user->nextid();
$user->name = $request->name;
$user->email = $request->email;
$user->password = bcrypt($request->password);
$user->roles = "user";
$user->save();
return response()->json([
'status' => 200,'message' => "user registerd"
],200);
}
/**
* Login User
* @param Request $request
* @return User $user with token
*/
public function login(Request $request)
{
$validator = Validator::make($request->all(),[
"email" => "required|email","password" => "required"
]);
if($validator->fails()){
return response()->json([
'status' => 400,'message' => "Bad Request"
],400);
}
if(!Auth::attempt($request->only('email','password'))){
return response()->json([
'status' => 401,'message' => "Unauthorized"
],401);
}
$user = User::where("email",$request->email)->first();
$token = $user->createToken('user token')->plainTextToken;
Arr::add($user,'token',$token);
return response()->json($user);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。