摆脱Laravel 5.8中的所有重定向和“非API”行为

时间:2019-03-31 11:55:21

标签: laravel laravel-5 laravel-5.8

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

示例

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

    $response->assertStatus(401);
}

端点/competitions/ABCDEFG受身份验证中间件的保护。

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

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

我定义了一个扩展了Illuminate\Http\Request

的新类“ DefaultRequest”
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));
}

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

1 个答案:

答案 0 :(得分: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');
    }
    ...
}