【问题标题】:Laravel 5.6 Method Illuminate\Database\Query\Builder::createToken does not existLaravel 5.6 方法 Illuminate\Database\Query\Builder::createToken 不存在
【发布时间】:2018-07-18 01:58:41
【问题描述】:

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

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

错误

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

应用\用户

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',
    ];
}

注册控制器

**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);
    }**
}

【问题讨论】:

    标签: laravel laravel-5


    【解决方案1】:

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

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

    【讨论】:

    • 感谢工作!只是另一件事,似乎我无法使用该语句检查数据库中的哈希密码,除非我使用哈希密码,否则我该如何在该语句中执行 Hash::check() ......?
    • 删除第二个 where,所以你的查询看起来像这样User::where('email', $email)->first();,然后将你的条件重构为类似下面的if ($user && Hash::check($password, $user->password))
    【解决方案2】:

    您需要添加 get()first() 或 'firstOrFail()' 等方法来获取数据库结果。所有where 链只返回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
    }
    

    【讨论】:

      【解决方案3】:

      你需要添加

      use Laravel\Passport\HasApiTokens;
      
      class User extends Authenticatable {
      
      use HasApiTokens,
          Notifiable;
      

      你的用户模型的特征。

      【讨论】:

        猜你喜欢
        • 2019-11-17
        • 2018-09-24
        • 2019-01-24
        • 2019-10-04
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 2020-02-24
        • 1970-01-01
        相关资源
        最近更新 更多