Получить тело ответа от объекта ответа в Middleware - PullRequest
0 голосов
/ 04 октября 2018

У меня есть промежуточное ПО для регистрации всех запросов и ответов (для API).Но ответ не отображается в объекте ответа метода завершения.

class Logger
{

    public function handle($request, Closure $next)
    {
        return $next($request);
    }

    public function terminate($request, $response)
    {
        Log::info('ApiLog done===========================');
        Log::info('URL: ' . $request->fullUrl());
        Log::info('Method: ' . $request->getMethod());
        Log::info('IP Address: ' . $request->getClientIp());
        Log::info("Data: ",[$request->all()]);
        // Log::info("Query String: ", [$request->query()]);
        Log::info("Response".$response->getContent());
    }
}

Но $ response-> getContent () возвращает ноль.Сначала я пытаюсь использовать дескриптор только для обработки запроса и получения ответа, затем запишите его, используя

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

    Log::response("",[$response])

    return $response;
}

Но объект не содержит тела.Он имеет только статус и информацию заголовка.Можете ли вы помочь мне, пожалуйста, чтобы получить ответ тело

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

это print_r HttpResponse от отладки:

Illuminate\Http\Response Object
(
    [headers] => Symfony\Component\HttpFoundation\ResponseHeaderBag Object
        (
            [computedCacheControl:protected] => Array
                (
                    [no-cache] => 1
                    [private] => 1
                )

            [cookies:protected] => Array
                (
                )

            [headerNames:protected] => Array
                (
                    [cache-control] => Cache-Control
                    [date] => Date
                    [content-type] => Content-Type
                )

            [headers:protected] => Array
                (
                    [cache-control] => Array
                        (
                            [0] => no-cache, private
                        )

                    [date] => Array
                        (
                            [0] => Thu, 04 Oct 2018 14:17:16 GMT
                        )

                    [content-type] => Array
                        (
                            [0] => text/html; charset=UTF-8
                        )

                )

            [cacheControl:protected] => Array
                   (
                )

        )

    [content:protected] => foobar content
    [version:protected] => 1.1
    [statusCode:protected] => 200
    [statusText:protected] => OK
    [charset:protected] => 
    [original] => foobar content
    [exception] => 
)

Свойство content:protected заменено на "foobar content" из-за его большого размера.Вы можете вызвать $response->setContent('foobar content');, чтобы установить значение содержимого, или $response->getContent();, чтобы получить значение содержимого.

Если $response->getContent(); возвращает ноль, вам необходимо проверить тип объекта $ response.Возможно, это не \Illuminate\Http\Response.

Это мое тестовое промежуточное ПО:

class RedirectIfAuthenticated
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check()) {
            return redirect('/home');
        }

        /** @var Illuminate\Http\Response $response */
        $response = $next($request);
        $foo = $response->getContent();

        return $response;
    }
}

Надеюсь, это поможет.Хорошего дня!

0 голосов
/ 04 октября 2018

Я отвечу здесь, чтобы поделиться большим кодом вместо комментариев.Таким образом, основываясь на документации, она должна быть либо в $routeMiddleware, либо $middleware, потому что если вы откроете фреймворк Kernel, вы увидите это:

$middlewares = $this->app->shouldSkipMiddleware() ? [] : array_merge(
        $this->gatherRouteMiddleware($request),
        $this->middleware
    );

на тех, которые вызывается функцией terminate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...