Laravel 5.6 方法 Illuminate\Database\Query\Builder::createToken 不存在

Laravel 5.6 Method Illuminate\Database\Query\Builder::createToken does not exist

我正在尝试使用 Passport 创建 API 身份验证,但是当使用 createToken() 注册用户时,我似乎无法创建令牌。

我已经检查过我已经包含了 HasApiTokens,但仍然出现同样的错误。

错误

Method Illuminate\Database\Query\Builder::createToken does not exist

App\User

namespace App;

use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
          'password', 'remember_token',
    ];
}

SignupController

**public function userLogin(Request $request) 
{
    $email = $request->email;
    $password = $request->password;

    $user = User::where('email' , $email)->where( 'password' , $password);
    if($user)
    {
        $token = $user->createToken('MyApp')->accessToken;
        $arr = array('token' => $token, 'status' => 'isTrue', 'userId' => $data[0]->id);
        //return response()->json($arr , 200);
    }**
}

您需要获取用户。目前 $user 是 QueryBuilder,不是用户对象。

User::where('email', $email)->where('password', $password)->first();

您需要添加get()first()或'firstOrFail()'等方法来获取数据库结果。所有 where 链只是 return QueryBuilder 的对象。第二件事是你不会将密码保存为纯文本(如果你正在保存那么请在保存之前更改它并对其进行哈希处理)。对于您的情况,它将变为:

$user = User::where('email' , $email)->where( 'password' , $password)->first();

哈希密码场景:

$user = User::where('email' , $email)->first();
if(Hash::check(optional($user)->password, $request->password)) {
    // your code here
}

您需要添加

use Laravel\Passport\HasApiTokens;

class User extends Authenticatable {

use HasApiTokens,
    Notifiable;

用户模型的特征。