我正在构建一个应用程序,我正在使用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 ..但我不能在中间件中执行相同的操作。
为什么呢?怎么做?
答案 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
];