Удалить промежуточное ПО body PSR-7 Slim3?

Я пытаюсь перенаправить пользователя на страницу входа, когда он не аутентифицирован. Я использую промежуточное ПО в Slim3 для проверки с помощью Sentinel. Работает, но мне нужно переопределить тело, чтобы не отображать содержимое. Например, я мог бы использовать CURL для доступа к маршруту, подобному / users, и получить всю страницу. Из-за этого мне нужно удалить / переопределить тело, если пользователь не аутентифицирован.

public function __invoke(RequestInterface $request, ResponseInterface $response, callable $next)
{

    $route = parse_url($request->getUri(), PHP_URL_PATH);

    if ($route !== '/login' && ! $user = Sentinel::check() )
    {
        $response = $response
            ->withStatus(301)
            ->withHeader("location", '/login')
        ;
    }
    return $next($request, $response);

}

person felipe    schedule 17.11.2018    source источник
comment
Когда не аутентифицирован, я бы не подумал, что стек промежуточного программного обеспечения даже позволит запросу перейти к любому созданию контента. Я думаю, вы могли бы сделать это здесь, просто вернув $response->with... вместо того, чтобы позволить ему перейти к вызову $next.   -  person Greg Schmidt    schedule 17.11.2018
comment
Ты прав. Также тело восстановится, если позвоню в следующий. Поэтому я не могу изменить его и вызвать $ next.   -  person felipe    schedule 17.11.2018
comment
Что ж, вы можете захватить возвращаемое значение из $next, затем переопределить тело, а затем вернуться по мере необходимости. Это ожидаемый способ изменить что-то на выходе, например, распознать URL-адреса в теле и заменить их ссылками. Ранний возврат кажется намного лучшим подходом для ваших нужд по ряду причин; просто хотел прояснить, что абсолютно возможно изменить ответ, который следующая вещь в очереди промежуточного программного обеспечения возвращает вам.   -  person Greg Schmidt    schedule 17.11.2018
comment
! $user = Sentinel::check() правильно?   -  person Script47    schedule 17.11.2018
comment
да, работает нормально, библиотека (sentinel) возвращает false, если пользователь не аутентифицирован   -  person felipe    schedule 17.11.2018
comment
замените $response = $response->... на return $response->..., как было предложено в ответе odan.   -  person Zamrony P. Juhara    schedule 19.11.2018
comment
Я исправил с комментарием Грега 2 дня назад.   -  person felipe    schedule 19.11.2018


Ответы (1)


Вы не должны вызывать обратный вызов $ next, если хотите только перенаправить пользователя:

public function __invoke(RequestInterface $request, ResponseInterface $response, callable $next)
{
    $route = parse_url($request->getUri(), PHP_URL_PATH);

    if ($route !== '/login' && ! $user = Sentinel::check() )
    {
        return $response
            ->withHeader('Location', '/login')
            ->withStatus(302);
    }

    return $next($request, $response);
}
person odan    schedule 17.11.2018
comment
Хотя этот код работает, метод withRedirect() не является частью ResponseInterface, а Slim\Http\Response. - person Zamrony P. Juhara; 19.11.2018