使用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
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));
}
我觉得这应该更容易解决。通常,这对我来说只是测试时的一个问题,我可以在测试中设置特定的标头。但是我想禁用所有这些重定向行为,因为我从不希望对项目使用这些重定向行为。
答案 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');
}
...
}