Laravel 5.6 серверные исключения возвращают ответ в формате json вместо html - PullRequest
0 голосов
/ 16 мая 2018

Итак, я заметил, что с последней версии 5.6 Laravel возвращает серверные исключения в формате json вместо html при обработке запросов ajax POST.Это реальная проблема для моей разработанной логики отладки из предыдущей версии, так как я рассчитывал, что laravel вернет отображаемую HTML-страницу ошибки как .responseText ответа, поэтому я мог легко отобразить весь контент в новойокно и ясно видеть (для целей отладки).В настоящее время происходит следующее:

  • .$ajax() POST-запрос отправляется на сервер;
  • возникает некоторая ошибка php на стороне сервера в функции, обрабатывающей ответ (скажем, неизвестныйпеременная, например)
  • , поэтому функция запроса ajax error получает свой первый аргумент (xhr), который на данный момент является массивом JSON со следующей структурой: enter image description here
  • теперь я хотел бы отобразить это сообщение в новом окне, но с отображаемым макетом HTML, который обычно предоставляет Laravel, и мне действительно нравится

Я бы действительно не хотелЯ не хочу начинать создавать внешний вид html самостоятельно, когда я уже знаю, что Laravel может сделать это для меня.Проблема в том, что я не смог найти недавнюю документацию по теме, а также не мог найти правильный способ вернуть визуализированный HTML-контент в качестве ответа.Итак, мой вопрос, может ли кто-нибудь посоветовать мне, как лучше всего сделать HTML-контент?Какой метод является лучшим способом получить то, что я хочу, и есть ли еще какой-то конкретный такой метод?Заранее спасибо!

Редактировать Вот мой запрос ajax:

$.ajax({
    method: "POST",
    url: '/updateModel',
    data: dataObject,
    success: success
});

Где dataObject - это действительно только содержащиеся данные для запроса.В моем исходном файле .js есть следующее:

$(function () {
            $.ajaxSetup({
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                }
            });
            $(document).ajaxStart(function() {
                showGlobalLoader(true); //shows the loader
            })
            .ajaxStop(function() {
                showGlobalLoader(false); //hides the loader
            })
            .ajaxError(ajaxErrorGlobalFunction); //displays the new window - that's the function in question
        });

И затем это функция ajaxErrorGlobalFunction

function ajaxErrorGlobalFunction(xhr, status, error) {
    if (xhr.responseText) {
        //console.log(xhr.responseText);
        openErrorWindow(xhr.responseJSON);
    }
}


function openErrorWindow(json = "")
{
    var w = window.open('', '_blank', 'scrollbars=no,status=no,titlebar=no');
    $(w.document.body).html(json.message + "\n in file " + json.file + "\n on line " + json.line);
    w.resizeTo(1000, 1000);
    w.moveTo(0, 0);
    w.focus();
}

Как видите, я использовалпросто отобразить xhr.responseText как html-содержимое окна, но теперь я вынужден был обойти его, извлекая наиболее важную информацию из json.Я действительно хотел бы получить старый добрый HTML-контент в ответ на запрос.Заранее спасибо!

1 Ответ

0 голосов
/ 17 мая 2018

Как вы можете видеть в обработчике исключений ( Подсветка / Основы / Исключения / Handler.php : 185 ):

return $request->expectsJson()
    ? $this->prepareJsonResponse($request, $e)
    : $this->prepareResponse($request, $e);

Если запросу нужен json в качестве ответа, он преобразует его в json, в противном случае он отобразит его, как раньше.

Добавьте dataType к вашему запросу Ajax, который не является json, и это должно работать:

$.ajax({
    method: "POST",
    url: '/updateModel',
    data: dataObject,
    dataType: 'html',
    success: success
});

Обновление

Если вы хотите всегда отображать исключения в виде HTML, вы можете обновить функцию визуализации обработчика исключений ( app / Exceptions / Handler.php ), скопировав визуализацию родителя. функция и удалить expectsJson троичный:

if (method_exists($e, 'render') && $response = $e->render($request)) {
    return Router::toResponse($request, $response);
} elseif ($e instanceof Responsable) {
    return $e->toResponse($request);
}

$e = $this->prepareException($e);

if ($e instanceof HttpResponseException) {
    return $e->getResponse();
} elseif ($e instanceof AuthenticationException) {
    return $this->unauthenticated($request, $e);
} elseif ($e instanceof ValidationException) {
    return $this->convertValidationExceptionToResponse($e, $request);
}

return $this->prepareResponse($request, $e);
...