Php 获取发送的Laravel路由器输出

Php 获取发送的Laravel路由器输出,php,laravel,lumen,Php,Laravel,Lumen,我在一个API中工作,有时它会中断并发送一些不是有效JSON的数据 我想检查每个请求的返回值是否是有效的JSON 如何收听每个请求输出 可能在Laravel\Lumen\Routing\Router或Laravel\Lumen\Application上,您可以注册一个中间件,在请求发送到服务器后运行,对吗 例如: <?php namespace App\Http\Middleware; use Closure; class AfterMiddleware { public f

我在一个API中工作,有时它会中断并发送一些不是有效JSON的数据

我想检查每个请求的返回值是否是有效的JSON

如何收听每个请求输出


可能在
Laravel\Lumen\Routing\Router
Laravel\Lumen\Application
上,您可以注册一个中间件,在请求发送到服务器后运行,对吗

例如:

<?php

namespace App\Http\Middleware;

use Closure;

class AfterMiddleware
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        // Perform validation action on $response? 

        return $response;
    }
}

就像@Mozammil所说的,只需要一个中间件就可以了。跟随它在决赛中的感觉

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Response;
use Mockery\Exception;

class AfterMiddleware
{
    public function handle($request, Closure $next)
    {
        /** @var Response $response */
        $response = $next($request);

        // Response content are a JSON?
        if (!$this->isJson($response->content())){
            // Not a JSON!!
            // Log everywhere
        }

        return $response;
    }

    private function isJson($string) {
        json_decode($string);
        return (json_last_error() == JSON_ERROR_NONE);
    }
}
最后将中间件添加到我的
api
路由中:

$router->group([
    'middleware' => 'afterMiddleware',
    'prefix' => 'api'
], function () use ($router) {
    $router->get('/', function () use ($router) {
        return response(["success"=>true]);
    });

    $router->get('/bug/', function () use ($router) {
        return "I'm not a JSON and it will catch on AfterMiddleware handle";
    });
});

美好的如果您使用的是PHP7.3+,那么还有一种更好的方法来实现。
$router->group([
    'middleware' => 'afterMiddleware',
    'prefix' => 'api'
], function () use ($router) {
    $router->get('/', function () use ($router) {
        return response(["success"=>true]);
    });

    $router->get('/bug/', function () use ($router) {
        return "I'm not a JSON and it will catch on AfterMiddleware handle";
    });
});