Хобрук: Ваш путь к мастерству в программировании

Slim3 как я могу управлять ошибками смешанного типа контента

Мне нужно настроить приложение Slim для содержимого html и json. У меня будет только один обработчик ошибок, и он должен отвечать как json для json enpoints и страницы ошибок html для представлений html. В старом модном Slim (v.2) я определил представление в начале маршрута, поэтому я мог проверить тип представления (веточка или json), чтобы понять, как ответить.

В новой реализации Slim3 представление будет отправлено в конце маршрута, и, насколько мне известно, нет возможности определить его раньше.

Как я могу управлять этими ошибками смешанного содержания?

Я думал использовать заголовок типа содержимого запроса, но нет настоящего правила, согласно которому тип содержимого должен соответствовать ответу, например, я могу отправить какой-то запрос как application / json и получить ответ text / html, я также не могу используйте заголовок Accept, потому что он может отсутствовать или быть общим */*.


Ответы:


1

Я думаю, это зависит от того, как вы решите, между возвращением формата json или html.

Например, вы можете вернуть ошибку в формате json, когда ее запросит от AJAX, иначе вы вернете html.

Если у вас есть обработчик ошибок, который возвращает html, как в следующем коде

<?php namespace Your\App\Name\Space\Errors;

class HtmlErrorHandler
{

    public function __invoke($request, $response, $exception)
    {
        $err = '<html><head></head><body>' .
            '<div>code : ' . $exception->getCode() . 
            ' message' . $exception->getMessage() '</div>';
        return $response->withStatus(500)
            ->withHeader('content-Type : text/html')
            ->write($err);
    }
}

и обработчик ошибок, который возвращает json,

<?php namespace Your\App\Name\Space\Errors;

class JsonErrorHandler
{    
    public function __invoke($request, $response, $exception)
    {
        $err = (object) [
            'code' => $exception->getCode(),
            'message' => $exception->getMessage(),
        ];
        return $response->withStatus(500)->withJson($err);
    }
}

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

<?php namespace Your\App\Name\Space\Errors;

class Http500Error
{
    private $jsonErrorHandler;
    private $htmlErrorHandler;

    public function __construct($jsonErrHandler, $htmlErrHandler) 
    {
        $this->jsonErrorHandler = $jsonErrHandler;
        $this->htmlErrorHandler = $htmlErrHandler;
    }

    public function __invoke($request, $response, $exception)
    {
        if ($request->isXhr()) {
            $errHandler = $this->jsonErrorHandler;
        } else {
            $errHandler = $this->htmlErrorHandler;        
        }
        return $errHandler($request, $response, $exception);
    }
}

Или вы можете поместить определенную переменную в строку запроса, чтобы указать, какой формат нужен клиенту, тогда вы можете использовать

if ($request->getParam('format', 'html') === 'json') {
    $errHandler = $this->jsonErrorHandler;
} else {
    $errHandler = $this->htmlErrorHandler;        
}

Затем вы вставляете обработчик ошибок в контейнер

use Your\App\Name\Space\Errors;
...
$app = new \Slim\App();
$c = $app->getContainer();
$c['errorHandler'] = function ($c) {
    return new Http500Error(new JsonErrorHandler(), new HtmlErrorHandler());
};
30.06.2019
Новые материалы

Я собираюсь научить вас Python шаг за шагом
Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..

React on Rails
Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

Что такое гибкие методологии разработки программного обеспечения
Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

Ториго  — революция в игре Го
Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

Математика и интуиция - Часть 1
У каждой математической формулы есть доказательство. Часто эти доказательства слишком сложно понять, поскольку многие из них основаны на индукции, некоторые - на очень сложных наблюдениях, а..