在中间件中返回 json 错误?

chi*_*hii 5 laravel-5

我正在构建一个应用程序,我使用 laravel5 作为 webAPI。当 webAPI 处于维护模式时,我想向 app 返回一个 json 错误,我将在 app 中获取状态代码以显示合适的消息。

我出于某种原因重写了 laravel CheckForMaintenanceMode 并将其注册到内核中。

我写的

if ($this->app->isDownForMaintenance()) {
    $ip = $request->getClientIp();
    $allowIp = "111.222.333.444";
    if ($allowIp != $ip) {
        return response()->json(['error' => "Maintenance!!"], 503);
    }
}
return $next($request);
Run Code Online (Sandbox Code Playgroud)

但是我在应用程序方面什么也没有。我无法收到消息,状态....

我写了return response()->json(['error' => "errormessage"], 422);和控制器一样的代码,我可以在应用程序中获取 message.status.. 但我不能在中间件中做同样的事情。

为什么?怎么做?

chi*_*hii 6

这有效:

if ($this->app->isDownForMaintenance()) {
    $ip = $request->getClientIp();
    $allowIp = "111.222.333.444";
    if ($allowIp != $ip) {
        return response(['Maintenance'], 503);
    }
}
return $next($request);
Run Code Online (Sandbox Code Playgroud)

并且不在内核全局HTTP中间件中注册中间件而是将其放在路由(api.php)中,例如:

Route::group(['middleware' => 'maintenance'], function(){******}
Run Code Online (Sandbox Code Playgroud)

我真的不知道为什么,但这对我有用。


Tai*_*sco 5

完整示例

public function handle($request, Closure $next)
    {
        if($request->token == "mytoken")
            return $next($request);
        else  return response(['Token mismatch'],403);
    }
Run Code Online (Sandbox Code Playgroud)

解释

中间件响应
must be an instance of Symfony\Component\HttpFoundation\Response

所以,要返回 json,你必须这样做

return response(['Token mismatch'],403);
Run Code Online (Sandbox Code Playgroud)

中间件必须注册在Kernel.php