在中间件中返回一个json错误?

时间:2017-03-29 07:48:13

标签: laravel-5

我正在构建一个应用程序,我正在使用laravel5作为webAPI。 当webAPI处于维护模式时,我想将json错误返回给app,我将在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);

但是我可以在应用程序方面得到什么。我无法得到消息,satus ....

我在控制器中编写了与return response()->json(['error' => "errormessage"], 422);相同的代码,我可以在应用程序中获取message.status ..但我不能在中间件中执行相同的操作。

为什么呢?怎么做?

3 个答案:

答案 0 :(得分:3)

这有效:

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

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

Route::group(['middleware' => 'maintenance'], function(){******}

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

答案 1 :(得分:1)

完整示例

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

说明

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

因此,要返回json,您必须这样做

return response(['Token mismatch'],403);

中间件必须在Kernel.php中注册

答案 2 :(得分:0)

更干净的方法是扩展

Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode

并根据需要进行更改,并像这样更新App\Http\Kernel.php

  

App \ Http \ CustomMaintanceMiddleware.php

namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
use Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode;

class CustomMaintanceMiddleware extends CheckForMaintenanceMode
{
    public function handle($request, Closure $next)
    {
      if ($this->app->isDownForMaintenance()) {
        return response(['Maintenance'], 503);
      }
      return $next($request);
    }
}
  

Kernel.php

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class
]; 

TO

protected $middleware = [
    \App\Http\CustomMaintanceMiddleware::class
];