0

我目前在使用 Laravel 作为 API-only 后端时遇到了一些问题。我想单独开发前端,因此仅将 Laravel 视为 API。我在编写测试时遇到问题。我仍在使用网络中间件组(不是 API),并且在使用auth中间件时,例如在使用邮递员进行测试时一切正常,但在编写测试时。

例子

public function search_competitions_unauthorized ()
{
    $response = $this->get('/competitions/ABCDEFG');

    $response->assertStatus(401);
}

端点/competitions/ABCDEFG受 auth 中间件保护。

我收到 500 作为响应代码,因为没有login定义名称的路由。这很容易解决(创建一个名为 login 的路由),但我希望 Laravel 将每个请求都视为没有任何重定向的 API 请求。

我已经尝试了一些方法来摆脱这种行为。

我定义了一个新的类“DefaultRequest”,它扩展Illuminate\Http\Request

class DefaultRequest extends Request
{
    public function expectsJson()
    {
        return true;
    }

    public function wantsJson()
    {
        return true;
    }
}

我更改了公共文件夹中的 index.php。

$response = $kernel->handle(
    $request = App\Http\Requests\DefaultRequest::capture()
);

此外,我的控制器中使用的所有请求都将其用作默认值。由于我在请求验证方面遇到了同样的问题,因此我也将此方法添加到了我的默认请求中。

protected function failedValidation(Validator $validator)
{
    throw new HttpResponseException(response()->json($validator->errors(), 422));
}

我觉得这应该更容易解决。一般来说,这对我来说只是测试时的问题,我可以在测试中设置特定的标题。但是我想禁用所有这些重定向行为,因为我从不希望这些用于项目。

4

1 回答 1

0

我通过放置请求类型检查来解决它app/Exceptions/Handler.php,如下所示:

public function render($request, Exception $e)
{
    ...
    // handling unauthenticated requests
    if ($e instanceof \Illuminate\Auth\AuthenticationException) {
        if (
            $request->wantsJson() ||
            $request->expectsJson() ||
            array_get($request->route()->action, 'prefix') == 'api'
        ) {
            return response()->json(['error' => 'Unauthenticated.'], 401);
        }
        return redirect()->route('login');
    }
    ...
}
于 2019-04-01T04:33:33.667 回答