Laravel - 测试 api 时方法 Illuminate\Auth\RequestGuard::attempt 不存在

Posted

技术标签:

【中文标题】Laravel - 测试 api 时方法 Illuminate\\Auth\\RequestGuard::attempt 不存在【英文标题】:Laravel - Method Illuminate\Auth\RequestGuard::attempt does not exist when testing the apiLaravel - 测试 api 时方法 Illuminate\Auth\RequestGuard::attempt 不存在 【发布时间】:2019-12-21 10:42:04 【问题描述】:

我使用 Laravel-Passport 对我的 api 端点进行 Laravel 5.8 身份验证

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\User;
use Validator;

    public function login(Request $request)

    $validator = Validator::make($request->all('email', 'password'), [
        'email' => 'required|string|email|max:255',
        'password' => 'required|string|min:6'
    ]);

    if ($validator->fails()) 
        return response()->json(['error'=>$validator->errors()], 401);
    ;

    if(Auth::attempt(['email' => request('email'), 'password' => request('password')]))
        $user = Auth::user();
        $success['token'] = $user->createToken('MyApp')-> accessToken;
        return response()->json(['success' => $success], 200);
    
    else
        return response()->json(['error'=>'Can not log in with the data provide.'], 401);
            
 

auth.php

    'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

当我在 POSTMAN 上测试端点时,我得到了这个错误:

错误的原因是什么,我该如何解决?

BadMethodCallException 方法 Illuminate\Auth\RequestGuard::attempt 不存在。

【问题讨论】:

当您尝试Auth::guard('web')-&gt;attempt(... 时会发生什么? 当我这样做时,我遇到了另一个错误,如图所示:在 null 上调用成员函数 createToken() 您是否也将Auth::user() 更改为Auth::guard('web')-&gt;user() 非常感谢。它有效 很高兴能帮上忙!立即将其发布为答案。 【参考方案1】:

在测试我最近添加的路线时,我遇到了同样的问题。清除缓存的路线为我解决了这个问题:

php artisan route:clear

【讨论】:

【参考方案2】:

要使用用户名和密码登录用户,您需要像这样使用web 身份验证保护:

if(Auth::guard('web')->attempt(['email' => request('email'), 'password' => request('password')]))
        $user = Auth::guard('web')->user();

【讨论】:

以上是关于Laravel - 测试 api 时方法 Illuminate\Auth\RequestGuard::attempt 不存在的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:在 API 测试中使用 Eloquent 模型

laravel phpunit 测试与 api 令牌认证

Laravel 5.1 使用 JSON 的 API 的 PHPUnit 测试

在同一控制器中以其他方法访问会话数据在 laravel 中不起作用

使用Laravel资源测试API端点的问题

Laravel 8 上的 HTTP RESTful API 功能测试